Introductie:

Dit logboek gaat over Genomics en Transcriptomics, De eerste 5 weken focussen we op het Genomics gedeelte. In de Genomics kant van dit onderzoek gaan we kijken naar het volgende: Zijn er varianten aanwezig van PAX5 en Ebf1 in het genoom van de rag2 knockout muizen die gebruikt zijn? De reden dat gekozen is voor PAX5 en Ebf1 is omdat deze betrokken zijn bij de ontwikkeling van voorloper B cellen. Wanneer er variatie zit in onze DNA-seq kan dat erop wijzen dat de Ebf1 en PAX5 niet goed kunnen ontwikkelen wat er voor zorgt dat de voorloper B cellen nooit goed naar B cellen kunnen transformeren. Dit kan dus zorgen voor fouten in de ontwikkeling van de muis.

In het transcriptomics gedeelte wordt hier ook gebruik van gemaakt dus is het goed om te weten of er varianten aanwezig zijn in het genoom van de muizen die voor transcriptomics gebruikt worden (Rag2 knockout).

Onderzoeksvraag

Zijn er varianten aanwezig van PAX5 en Ebf1 in het genoom van de rag2(-/-) muizen die gebruikt zijn?

Workflow

DNA was wel een deel van onze dataset echter is er in het referentie onderzoek ( Ma et al. (2024) ) niet wat er mee gedaan is. Dit is de reden dat we hebben besloten om een variant analyse te doen op de data. Hier gaan we het referentiegenoom van de muis vergelijken met DNA seq data. In het onderzoek is het mm10 genoom gebruikt, dit genoom komt uit 2012 wat dus redelijk oud is en om deze reden vervangen wij dit oude genoom met het nieuwe muis genoom de GRCm39 deze komt uit 2020. De eerste stap is om de .SRA files te downloaden van de archieven, deze bevatten fastq bestamden, prefetch wordt gebruikt hiervoor. Dan worden de .SRA files uitgepakt door het gebruiken van fasterq-dump. Deze fastq files worden door FastQC gehaald om de kwaliteit te checken. De files worden geanalyseerd op kwaliteit en worden hierna getrimmed zo nodig. Duplicaten en adapters worden uit de DNA-seq gehaald en de data wordt gealiëneerd. Daarna wordt freebayes gebruikt om de DNA-seq te vergelijken met het referentie genoom wat dus de variant analyse is. Uit deze variant analyse resultaten wordt een visualisatie gemaakt en een conclusie of er wat gevonden is.

Het onderzoek

Dit onderzoek focust op variant analyse, hierom is de onderzoeksvraag ook: Zijn er varianten aanwezig van PAX5 en Ebf1 in het genoom van de rag2(-/-) muizen die gebruikt zijn?

Deze onderzoeksvraag is relevant omdat er in het transcriptomics van het originele onderzoek Ma et al. (2024) gekeken wort naar verschillen in expressie van de genoemde genen. Als er varianten aanwezig blijken te zijn in deze genen kan het verschil in de expressie tussen de muizen die gebruikt zijn in het onderzoek niet alleen aan de geteste factoren toegewezen worden. De invloed van veroudering op expressie is dan niet zeker want de mutaties kunnen ook voor andere werking zorgen van de genen.

Er is alleen DNA sequentie data beschikbaar van de rag(-/-) muizen. Om deze reden kan er niet gekeken worden naar mutaties in het rag2 gen, Deze is dus niet meer aanwezig.

Het Ebf1-gen, ook bekend als Early B-cell factor 1, speelt een cruciale rol in de differentiatie van voorlopercellen van B-lymfocyten. Een verminderde expressie van het Ebf1-gen kan resulteren in functieverlies van B-cellen. In samenwerking met PAX5 zijn deze genen betrokken bij de rijping van hematopoetische stamcellen. Een verlies van functie van PAX5 leidt tot de ophoping van snel delende lymfoblasten die niet in staat zijn tot normale differentiatie.

Relevantie voor ons onderzoek, De onderzoekers van het artikel hebben, in tegenstelling tot de analyses die het transcriptomicsgedeelte van de analyse berteffen, geen gebruikgemaakt van deze DNA data en andere gegevens, waardoor er geen vergelijkbare gegevens zijn. Hoewel ze een verouderd muis referentiegenoom (mm10) hebben toegepast, vervangen we dit door mm39.

Hieronder is een overzicht te zien van de Tools die wij gaan gebruiken in ons onderzoek.

Tool Referentie Versie Waarom
Featurecounts https://academic.oup.com/bioinformatics/article/30/7/923/232889?searchresult=1 Featurecounts is een zeer efficiënt algemeen “read” samenvattingsprogramma dat mapped reads telt voor genomische kenmerken zoals genen, exonen, promotor, genlichamen, genomische bins en chromosomale locaties. het kan worden gebruikt om zowel RNA-seq als genomische DNA-seq leesbewerkingen te tellen
FastQC https://www.bioinformatics.babraham.ac.uk/projects/fastqc/ 0.11.9 FastQC wordt gebruikt om de kwaliteit te checken van de rauwe data, hier uit is te zien of de data gelijk te gebruiken is of dat deze moet worden getrimmed. De trimmer kan ook afgesteld worden op basis van de fastqc.
freebayes https://github.com/freebayes/freebayes 1.3.6 - linux versie freebayes is een haplotype gebaseerde gen variant detector, ontworpen om kleine polymorfismes te detecteren, SNP’s, inserties en deleties in het bijzonder. Dit programma gebruikt .BAM bestanden met een Phred+33 encoding.
seqtk https://github.com/lh3/seqtk seqtk wordt gebruikt voor het proceseren van sequences in het FASTA of FASTQ formaat. het “seamlessly parses” beide FASTA en FASTQ welke dan ook optimaal compressed wordt door gzip
Trimmomatic https://github.com/usadellab/Trimmomatic 0.39 Trimmomatic wordt gebruikt om de data op te schonen nadat dez uit FastQC komt. Deze haalt de slechte kwaliteit paren af van de streng waardoor een hoge kwaliteit RNA- of DNA-streng overblijft die gebruikt kan worden.
bwa mem2 https://github.com/bwa-mem2/bwa-mem2?tab=readme-ov-file 2.2.1 Bwa mem2 wordt gebruikt om DNA en RNA reads te alignen tegen een gekozen referentie genoom.
Samtools https://www.htslib.org 1.16.1 samtools is een set van “utilities” dat alignments in de SAM, Bam en CRAM formatten kan manipuleren. het kan veranderen tussen de formats, sorteren, samenvoegen en indexen, ook kan het “reads” snel vinden in elke regio
R https://www.r-project.org 4.4.1 R is de code taal die gebruikt wordt om alle statistieken testen te doen en tevens de visualisatie van de data die komt uit het onderzoek
R-studio https://posit.co 2023.12.1+402 R studio is het programma wat wordt gebruikt als IDE voor R
NCBI-GEO https://www.ncbi.nlm.nih.gov/geo/ NCBI-GEO is gebruikt om het originele onderzoek te vinden waar dit onderzoek inspiratie vanaf neemt
Planning - Tijd voor onderzoek Genomics & Transcriptomics
Planning - Tijd voor onderzoek Genomics & Transcriptomics

Week 1 - Project Opzet

Doelen van de week

Het maken van een team & Onderzoeken zoeken met potentie

Het maken van een samenvatting van de Methoden

Het downloaden van de data doormiddel van SRA

Taken lijst - Week 1

  • Team maken
  • Literatuur + data set zoeken
  • Week planning maken
  • Afmaken Methoden
  • Herlezen document
  • Checken Methoden
  • Bash script schrijven voor de download
  • De SRA unpacken en data controleren

In de klas is er een groep gemaakt samen met Floris, Storm en Ivar. Wij vieren hebben als doelstelling een goed en interessant onderzoek te presenteren. De motivatie in deze groep is dus een goede basis om op te bouwen.

De Data set zoeken word gedaan via NCBI in de GEO datasets catagorie met de volgende zoek opdracht die als standaard is gesteld door de opdracht gevers: “(”expression profiling by high throughput sequencing”[DataSet Type]) AND “genome variation profiling by high throughput sequencing”[DataSet Type]”

Aan deze query kan aan het einde nog een woord of onderwerp toegevoegd worden. In onze groep is besproken naar wat onze interesses waren en het hoofd idee was “aging” ook wel veroudering. Dit komt omdat gen expressie veranderd naarmate een organisme ouder word. Dit is anders in elk organisme en daardoor word er veel onderzoek naar gedaan. Wij zijn gekomen op 3 onderzoeken die uit eindelijk interessant waren

Niet gekozen Onderzoeken

  • Zhang et al. (2021) : MiniCAFE, a CRISPR/Cas9-based compact and potent transcriptional activator, elicits gene expression in vivo. Dit onderzoek gaat over CRISPR-bemiddelde gen activatie. Dit is een belovende gen veranderingstrategie die DNA kan veranderen zonder dat de dubbele helix breekt. Deze is laten controleren door de opdrachtgever en die zei het volgende “Interessant onderzoek en leuk artikel, maar volgens mij zijn er voor het RNA-Seq gedeelte voor de meeste groepen maar 2 replicaten beschikbaar terwijl we daar minimaal 3 willen hebben. Mochten jullie niet iets anders kunnen vinden dan kunnen we dit experiment alsnog gebruiken, maar daar zitten wel wat risico’s aan.” Hierdoor zijn we gaan kijken naar andere opties.

  • Takasugi et al. (2023) : Gene expressions associated with longer lifespan and aging exhibit similarity in mammals. Dit onderzoek hadden wij als tweede optie gevonden, het onderzoek gaat over gen expressie geassocieerd met langere levensspan en veroudering laten gelijkenis zien in zoogdieren. Dit onderzoek is niet gekozen door de onbeschikbaarheid van de DATA.

Gekozen onderzoek

  • Ma et al. (2024) : Three-dimensional chromatin reorganization regulates B cell development during ageing. Dit is de keuze geworden door de aanwezigheid van veel data. Dit zijn in totaal 76 samples die genomen zijn van de jonge en oudere muizen. Deze samples zijn van meerdere catagorien maar voor ons belangrijk zijn de verschillende RNA samples. Het doel van dit onderzoek is ook erg interresant en wij hebben na het lezen gelijk al nieuwe dingen geleerd. Wat er uit sprong was de A/B compartenment in de nucleus. Dit is een recente ontdekking en zegt dat er een A compartement is waar de genen worden expressed maar in het B compartement worden de genen niet expressed. Deze twee compartementen zitten nouw bij elkaar en laat dus zien dat er wel structuur zit in waar een gen zit en waar het niet zit in de cel.

Week planning

Door middel van het programma Trello is er een week planning gemaakt. Hier worden ook de taken verdeeld dit is te zien aan de foto’s bij de tickets. De foto laat een gebruiker zien, dit gecombineerd met de datum waar voor het af moet zijn geeft ons een duidelijke verdeling. De datum toevoeging geeft de gebruiker die de ticket heeft ook een herinnering.

Hier een voorbeeld foto.

Trello planning
Trello planning

Hier zetten wij tickets in die aan bepaalde personen met verschillende urgenties

  • MUST - Moet gedaan worden voor een bepaalde datum of het einde van het project.

  • SHOULD - zou gedaan moeten worden want je wil het project liever niet opleveren zonder.

  • COULD - kan gedaan worden maar is zeker niet essentieel voor het project.

De planning van de week voor mij was dat ik de Methoden moest bekijken en samenvatten voor zover mogelijk zodat de belangrijkste delen hiervan in het PVA en de Powerpoint werden gezet.

De methoden zijn belangrijk omdat hierin de benodigdheden staan voor replicatie van het onderzoek. In de gekozen paper waren verschillende methoden die voor ons niet belangrijk zijn. Dit zijn bijvoorbeeld waar de muizen zijn gekocht of de Hi-C methoden, voor ons onderzoek is dit niet belangrijk omdat wij alleen naar de DNA-seq gaan kijken in vergelijking met het Referentie genoom (GRCm39)

https://trello.com

Methoden

Het weten van de methoden is belangrijk omdat wij moeten weten wat wij kunnen repliceren en wat te ver gegrepen is voor ons onderzoek en dit zou onze onderzoeksvraag kunnen beïnvloeden. Als we Hi-C als voorbeeld nemen dit is een hoge doorvoer techniek die chromatine conformatie vastlegt. Dit zouden wij niet in onze 5 weken kunnen doen op een goede manier. Dit is waarom wij kiezen voor de genoom analyse voor afwijkingen met het algemene referentie genoom.

In de les heb ik de methoden afgemaakt er waren uit eindelijk 24 methoden waar de materialen een beetje in gemixt stonden dit waren de volgende. Hier zijn er een paar die wel interessant zijn voor ons eigen onderzoek. Alle 24 methoden staan samen gevat in een extern document die te vinden is in de git.

  • Mice - Waar de muizen vandaan kwamen, de leeftijd en welke type met welke aanpassingen dit waren in ons geval C57BL/6J muizen van 8-12 weken oud voor de jongen en 100-110 weken oud voor de oudere muizen

  • Cell lines - De D345 cell line een “Wild-type D345” van yale zijn gecultureerd in RPMI1640 met 10% FBS en 1x penicillin streptomycin oplossing. Een variatie van de Rag2 cell, Ebf1 cell en de Pax5+ zijn gekweekt. verder ook 293T menselijke embronische nier cellen gekocht van ATCC gebruikt voor lentiviral expressie. Plat-E cell line gebruikt voor “retroviral” expressie. Alle cellen waren gekweekt in een 37 graden bevochtigde atmosfeer met 5% CO2

  • Antibodies - antilichamen zijn in dit onderzoek gebruik voor “immunoprecipitation” ook wel immunoprecipitatie en het “stainen” van H3K27ac voor de “staining” worden IgG isotype control antilichamen gebruikt.

  • Chip-seq en HiChIP- Chromatine immunoprecipitatie-sequencing of ChIP-seq genoemd, een nieuwe moleculaire laboratoriumtechniek die de DNA-bindingslocaties van een bepaald eiwit identificeerd. De DNA-fragmenten die aan het specifieke eiwit zijn verbonden, worden opgevangen met behulp van gesynthetiseerde immunoglobulinen, waarna de DNA-fragmenten worden gesequenced. De verzamelde DNA-sequenties worden daarna met behulp van softwaretools geanalyseerd om de kwaliteit van de ChIP-seq en mogelijke DNA-bindingslocaties te evalueren. HiChIP is een recent ontwikkelde methode voor het onderzoeken van de conformatie van chromatine, waarbij een in situ Hi-C-bibliotheek wordt voorbereid, gevolgd door een chromatine-immunoprecipitatiestap (ChIP). Dit proces is in het algemeen gericht op de histonmodificatie H3K27ac of cohesie.

  • Pro-B cell purification - hier zuiveren ze de Pro-B cellen door middel van positieve selectie van CD19+ en B220 markers.

  • In situ Hi-C - In situ HiC maakt gebruik van de relatieve frequentie van DNA-DNA-ligatiegebeurtenissen om de driedimensionale structuur van een genoom te heropbouwen. Op deze manier worden restrictie-enzymverteerde uiteinden van genomisch DNA in vaste kernen aangegeven met gebiotinyleerde dNTP’s. DNA-DNA-ligatiegebeurtenissen die ontstaan door nabijheidsligatie worden daarna vastgelegd, versterkt en in de volgende generatie gesequenced om hun lineaire genomische positie vast te stellen, en hun driedimensionale relatie.

  • RNA-seq, De RNA-seq is niet heel belangrijk voor ons genomics deel echter is het wel belangrijk voor het transcriptomics deel. Dit wijst op hoe de RNA is gesequenced. Er zijn verschillende basis paren lengten gebruikt: 2x75, 1x100 , 2x100bp deze zijn allemaal gesequenced op een Illumina NovaSeq sequencer. De mapping is gedaan naar het mm10 genoom door middel van STAR. STAR is een aligner gemaakt om specifiek de vele uitdaging aan te pakken van RNA-seq data mapping. Het gebruikt een strategie om rekening te houden voor de “spliced” alignments.

Na alle methoden samengevat te hebben gingen wij als groepje kijken naar de materialen en methoden om te beslissen wat wij nodig hadden, wat outdated was en wat wij nog extra of anders wilden doen.

Onze gekozen methoden & materialen

  • Muis-Gen: Wij hebben in ons onderzoek een ander muis-gen dan het gen dat gebruikt is in het referentie onderzoek Ma et al. (2024) , dit is omdat het referentie onderzoek een redelijk oud muis-gen gebruikt dit is het mm10 gen deze komt uit 2012. Wij gebruiken de GRCm39 ook wel het mm39 gen. Wij gaan dit gen gebruiken om te kijken of er variatie in zit tussen onze muizen en dit nieuwere referentie gen, dit nieuwere gen kan ons dus nieuw inzicht geven op mogelijke variaties / mutaties. De reden voor gebruik is dus dat dit nieuwere genoom van betere kwaliteit moet zijn dan de mm10.

  • FastQC: Dit programma hebben we gebruikt om de kwaliteit van de data te bekijken, FastQC is een programma wat fasta en fastq files kan inlezen dit kan via commandline, via galaxy (een website met bio informatica tool) en een FastQC programma met GUI. FastQC beoordeeld de files via verschillende tests en analyzen. Deze tests en analyzen zijn wat dieper uitgelegt in het FastQC hoofdstuk in tabel 1. De reden voor gebruik van fastQC is dus omdat het een zeer betrouwbaar programma (door het gebruik in vele wetenschappelijke artikelen) is en makkelijk te gebruiken is.

  • Trimmomatic: Dit programma hebben we gebruikt om de data na FastQC hogere kwaliteit te maken. Dit programma gebruikt verschillende parameters om de DNA-seq aan te passen zodat de kwaliteit goed genoeg wordt om dit te kunnen gebruiken. De reden dat de data wel met goeie kwaliteit kan worden gebruikt is omdat het dan betrouwbaar is. De reden dat wij trimmomatic gebruiken is omdat Storm en Ivar al veel ervaring hebben met trimmomatic en deze tool is gemaakt door illumina een bedrijf wat goed bekend staat om zijn sequencers dus een gevestigt bedrijf, waardoor het een betrouwbare tool is.

  • Bwa-mem2: Gebruikt om DNA-seq te aligneren met ons referentiegenoom. Het kan korte en middellange DNA- of RNA-reads alignen. Voor ons is Whole genome sequencing interresant dit is omdat hierbij de genomen worden gescand en dan vergeleken met het gekozen referentie genoom (in ons geval mm39 - GCF_000001635.27) dit om genetische variaties te identificeren. De reden waarom wij bwa-mem2 gebruiken en niet STAR is omdat Bwa-mem2 beter is voor DNA dit is omdat STAR gespecialiseerd is in RNA-seq ook is bwa-mem2 heel accuraat voor DNA sequences allignment, het gaat goed om met mismatches, kleine indels en langere reads. Het voordeel van bwa-mem2 is ook dat het minder zwaar is op de memory van de pc’s. Musich, Cadle-Davidson, and Osier (2021)

  • Freebayes: Dit programma kijkt naar de alignement voor afwijkingen met het referentie genoom en geeft deze aan. De reden dat wij freebayes gebruiken is de goede documententatie en het makkelijke installatie proces. De bash scripts voor freebayes zijn makkelijk gemaakt en problemen kunnen snel worden verholpen met de documentatie die op de git staat.

Download - SRA script met prefetch

Eerst werd ons gevraagd om naar de juiste map te gaan. Dit kan door de terminal te openen naar onze home te gaan en cd naar /students/2024-2025/Thema05/ en hier de map voor ons project aan te maken.
Of het kan geworden met de GUI waar je ook begint met het openen van de home folder en dan in de zoekbalk het volgende typen “/students/2024-2025/Thema05/” Hier hebben wij de map aangemaakt genaamd “3dconformatieChomatine” een verkorte benaming van de paper. Hier in moest nog een map gemaakt worden die SRA moest worden genoemd. De data moesten wij van de ncbi geo website afhalen door een SraAccList te downloaden. Deze bevatte de naam-codes die wij dan in het systeem kunnen oproepen om ze vervolgens daar te downloaden en unpacken.

Hieronder is het script te zien die gebruikt is om de SraAccList aan te roepen deze te lezen en daarna wordt —output gebruikt om hem in de goede map te zetten “\” geeft een new line aan en de - -max-size 200g geeft aan dat de packed files niet meer mogen zijn dan 200 gigabytes

# Hier wil ik dat prefetch in de map te kijken SRA voor de gedownloade SraAccList deze wordt gebruikt om de files die ik wil te zoeken in de NCBI database
prefetch $(</students/2024-2025/Thema05/3dconformatieChromatine/SRA/SraAccList.csv) --output-directory \
/students/2024-2025/Thema05/3dconformatieChromatine/SRA/ --max-size 200G

Prefetch is deel van de SRA toolkit, dit programma downloads Runs (sequence files in het gecompresserde SRA format) en alle bijbehorende data benodigd om de Run van het SRA format naar een meer bruikbare file format om te zetten. Deze file formats kunnen fasta of fastq zijn bijvoorbeeld. Prefetch kan ook worden gebruikt om incomplete Run downloads af temaken en te corrigeren.

SRA Toolkit Release 3.1.1 is gebruikt. in deze toolkit zitten verschillende tools die gebruikt worden. De reden dat wij deze toolkit gebruiken is omdat deze van NCBI komt dit is ook het platform waarvandaan wij onze data halen dit zou dus het makkelijkste moeten werken.

Het SRA file ziet er heel simpel uit

SRR26980549
SRR26980550
SRR26980551
SRR26980552

Het zijn de namen van de samples netjes onder elkaar.

Week 2 - Data download + Kwaliteit check

Doelen van de week

De SRA data uitpakken en de FastQ bekijken

Test data maken

Reads alignenen aan refentie genoom

Taken lijst

  • Bash script schrijven voor het uitpakken
  • Fastq quality checken
  • Test data maken
  • Reads alignenen

Data uitpakken - fasterq-dump

Om de SRA data naar fastq om te zetten gebruiken we fasterq-dump. fasterq-dump is een programma in de SRA toolkit, wij gebruiken Release 3.1.1, De reden voor het gebruik van fasterq-dump is de goede documentatie en de link met NCBI waar wij onze files vandaan halen. Fasterq-dump zit ook in de SRA toolkit deze staat geïnstalleerd op het systeem dit is makkelijk te doen door naar de git te kijken van Fasterq-dump ook wel de SRA toolkit git.

Fasterq-dump neemt de SRA files en extract de data hiervan naar fastq- of fasta files. in ons geval fastq files.

Het fastQ format is een text gebaseerde format voor het opslaan van biologische sequenties (meestal nucleotiden sequenties) als de corresponderende kwaliteit’s scoren.

De code hieronder zoekt eerst in de SRA map naar files met een filenaam die eindigt op .sra

deze runt hij parallel wat betekent dat hij meerdere processen doet over verschillende cores. Hij zet de files in een nieuwe map de fastq map en door de {} behoud het de naam waarmee het werd gedownload.

find /students/2024-2025/Thema05/3dconformatieChromatine/SRA/ -name "*.sra" | \
  parallel fasterq-dump -O /students/2024-2025/Thema05/3dconformatieChromatine/fastq/ {}

Een fastQ bestand heeft een bepaalde indeling:

Een header, deze header beginst met een @ teken wat gevolgd wordt door een sequentie ID en soms een bescrhijving van wat het bestand bevat. Na deze header komen de sequeneties deze hebben een score die worden aangegeven met een + als start. De score wordt weergegeven in ASCII characters, Het “!” teken geeft de

Hier is een voorbeeld van hoe de fasta file er uit kan zien:

@SEQ_ID - sequentie ID
GATTTGGGGTTCAAAGCAGTATCGATCAAATAGTAAATCCATTTGTTCAACTCACAGTTT - DNAseq
+ !’‘((((+))%%%++)(%%%%).1-+’’))**55CCF>>>>>>CCCCCCC65 - kwaliteit in ASCII

FastaQC - Raw data run

FastQC wordt gebruikt om de kwaliteit te checken van de rauwe data, hier uit is te zien of de data gelijk te gebruiken is of dat deze moet worden getrimmed. De trimmer kan ook afgesteld worden op basis van de Fastqc. Babraham Bioinformatics (n.d.)

Waarom wij FastQC gebruiken is omdat voor wij gaan werken met onze data willen wij zien of de data wel geschikt is om mee te werken. Als de kwaliteit heel slecht is dan kunnen er niet betrouwbare resultaten uit worden gehaald, en het is niet goed repliceerbaar.

Er zijn meerdere resultaten die uit een FastQC check komen hier is een uitleg wat er uit komt en hoe dit gelezen moet worden.

Table - 1
Catagorie Uitslag Hoe lees je dit
Basic statistics Hier krijg je een tabel met verschillende dingen zoals de Filename, file type, sequence length, %GC, Total sequences, Encoding en de sequences flagged as poor quality Het aflezen van deze tabel is lezen en checken of er geen fouten in zitten.
Per base sequence quality Een grafiek zoals te zien is in figuur 1

De grafiek heeft 3 vlakken die van verschillende grote en kleuren. De kwaliteit ranged van 0-40, 28-40 is goed and gekleurd groen, 20-28 is gekleurd geel/oranje, 0-20 gekleurd rood.

Verder representeert de gele box de 25th to 75th percentile. De zwarte lijnen geven de 10th en 90th percentile weer. De blauwe lijn geeft de gemiddelde scores voor kwaliteits controle score voor de nucleotide. gebaseerd op deze dingen is te zien dat de base van 1 tot 100 goede kwaliteit hierna gaat de kwaliteit sterk naar beneden. wat al aan geeft dat er getrimmed moet worden.

Per tile sequence quality Hier is een plot te zien waar de reads worden weergegeven als een soort heatmap. waarbij elke tegel 1 een read weergeeft op een bepaalde positie deze kwaliteit van de reads worden vergeleken met elkaar. Het aflezen van deze grafiek is door te kijken naar de kleur per tegel per positie. een donkerblauwe tegel betekent goede kwaliteit en hoe lichter de tegel word hoe slechter de kwaliteit dus lichtblauw betekent een slechte kwaliteit. Op de Y-as staat dan in welke tile het is en de X-as welke positie.
Per sequence quality score Een grafiek die je de gemiddelde kwaliteit op de
x-as en de nummer van sequences met gemiddelde op de y-as.
Het beste is wanneer de meeste reads een hoge gemiddelde kwaliteits score hebben en er geen grote dip in de grafiek is, dit betekent een lage kwaliteit.
Per base sequence content Hier is een plot te zien met een y-as waar 0-100 aangegeven wordt en een x-as met de “positie in read (bp)” in de grafiek staan 4 lijnen met het percentage per base In figuur 2 is het volgende uit de grafiek te halen er is significante variatie in de nucleotide distributie aan het bein van de reads positie 1-10. Dit zou kunnen zijn door de voorbereiding of de vooroordelen in het sequencen. A, T, C en G zijn niet gelijk gerepresenteerd. na de 10de positioe zijn de base wat gestabilizeerd wat aan geeft dat de sequence kwaliteit in de rest van de reads hoger zijn. Het afgekeurde kruis komt dus door de choas van 1-10.
Per sequence GC content Per sequence GC content geeft weer een plot weer met 2 lijnen. Een blauwe lijn die de theoretische distrubutie aangeeft wat dus een richtlijn is, en de GC count per read wat dus de gelezen data is. Het aflezen wordt door de twee lijnen vergelijken. het is ideaal als de twee lijnen overlappen of dichtbij elkaar liggen. Wanneer er meerdere pieken zijn die afwijken van de blauwe theoretische lijn kan dat betekenen dat er misschien sprake is van besmetting of sequencing errors. Er komt dus een rood kruis wanneer de GC abnormaal is vergeleken met de theoretische verwachting wat dus zegt da de algemene kwaliteit niet goed is.
Per base N content De per base N content grafiek geeft de frequentie weer van “N” basecalls op elke positie in de reads. De “N” staat voor een onzekere of onbekende nucleotide, deze kon de sequencer niet identificeren als 1 van de base (A, T, C, G) X-as geeft de positie weer in de reads, Y-as geeft het percentage van reads met een “N” base op elke positie. Een hoge waarde betekent dat de sequencer op die positie vaak onzeker was over welke nucleotide er aanwezig was. De verwachting is dat er een zeer laag percentage N’s in de sequence zit, de standaard hiervoor is <1%. afwijkende resultaten kan wijzen op problemen zoals slechte kwaliteit van de sequentie. Ze komen vaak voor aan het begin of eind van de reads.
Sequence length distribution De sequence length distribution grafiek laat de verdeling van de lengtes van de reads zien. X-as geeft de lengte van de sequenties (in basenparen) en de Y-as toont aantal reads van die specifieke lengte. Deze grafiek is belangrijk bij NGS omdat afwijkingen in de sequentie lengte kunnen wijzen op fragmentatie of technische fouten tijdens sequencering . Een ideaal resultaat is een scherpe piek op 1 specifieke lengte wanneer je 150 bp doelreadlengte hebt zou de meeste sequencing output op precies 150 bp moeten vallen wat een piek bij die lengte zou moeten opleveren. Als er meerdere pieken zijn of een vrede spreiding van lengtes kan dit beteken dat er sequencing fouten, slechte adaptertrimming of degradatie van het DNA-monster.
Sequence duplication levels

De Sequence duplication levels grafiek laat het percentage van sequences zien die meer dan 1x voorkomen. Duplicaties kunnen voorkomen door technische “artifacts” tijdens de sequencing en andere factoreren zoals PCR-amplificatie, en kunnen de diversititeit van de dataset verminderen. Dit heeft invloed op downstream analyses zoals genexpressie of variantdetectie.

X-as laat het aantal keren zien dat de specifieke sequentie wordt gedupliceerd

Y-as laat het percentage van reads dat voorkomt met duplicatie niveau zien

Het aflezen van de grafiek is door te kijken naar de twee lijnen in de grafiek de Duplicated sequences (meestal een rode lijn) geeft het percentage met unieke sequenties weer zonder correctie voor natuurlijke duplicaties. Het geeft een beeld van hoeveel van de reads in de dataset meerdere keren voorkomen zonder te differentiëren tussen technische en biologische duplicates. in de grafiek wil je graag een scherpe daling zien waarbij de meeste reads een duplicatie niveau van 1 hebben en het percentage gedupliceerede sequenties daarna snel afneemt.
De total sequences lijn (meestal een blauwe lijn) corrigeert voor verwachte natuurlijke duplicates deze laat zien hoe de duplicatie eruit zou zien zonder technische artefacten en biedt een eerlijker beeld van hoeveel sequenties overgedupliceerd zijn de de sequencering zelf.
Als er een groot verschil is tussen de lijnen betekent dit dat er duplicatie is onstaan door technische factoren zoals PCR duplicatie in plaats van biologische oorzaak. Te hoge aantal dupolactie kan probleem zijn voor downstream analyses en je wil dus dat de lijnen dichtbij elkaar liggen.
Overrepresented sequences Dit is een tabel die sequenties van op zijn minst 20bp die vaker voorkomen dan 0.1% van de totale nummer van sequenties. In de tabel staat de sequenties uitgeschreven, de count, het percentage en de waarschijnlijke bron Wanneer er een abnormaliteit te zien was in de Per sequence GC content grafiek kan er in deze tabel worden gekeken om de bron te vinden. als het niet staat als een bekende adapter of “vector”, kan het helpen om de data te blasten o te identiteit te vinden in de tabel.
Adapter content Een grafiek waar verschillende adapters staan Het geeft aan of de sequenties adapterfragmenten bevatten en van verschillende apparaten. als deze aanwezig zijn is het te zien door af te lezen in de grafiek welke positie er zijn om ze vervolgens weg te trimmen. deze “adaptercontent” is er voor identificatie van de DNA

Gebruikte bronnen voor uitleg

FastQC (n.d.)

Khetani (2018)

Uit onze fastQC resultaten kwamen wat bijzondere resultaten. Er waren reads van verschillende lengten de grootste was 300 base paren wat boven de algemene norm is.

Figuur 1: FastQC base sequence quality grafiek

Figuur 2: Per base sequence content

De conclusie uit de analyse van de FastQC resultaten is, Dat de generale statistieken 7 van de bestanden enorm veel duplicates wat een redelijk probleem vormt. Wat ook opvalt is dat alle bestanden met hoge duplicates een gem read lengte van 250 bp wat opmerkelijk lang is + de resultaten met enigszins goede kwaliteit hebben een gem lengte van 150 bp. Verder alle bestanden met veel duplicates bevatten veel minder reads dan de bestanden zonder of met weinig duplicates. Alle bestanden met 250 bp lengte eindigen aan het eind in het rode vlak in de sequentie kwaliteit en er is een dip bij de 110-120 waarna alles dus afzakt, voor de sequenties met 250bp is de kwaliteit goed van 0-110 bp. De sequence duplication levels zijn ook opmerkelijk door veel pieken en een hoog begin van de lijn. Overrepresented sequences vallen ook op want weer de 250bp bestanden hebben erg veel duplicates waar van sommige in de 50% zitten. Er zit ook heel veel adapter content bij 2 files is het zelfs >50%. Kortom deze files moeten getrimmed of verwijderd worden.

Deze code komt uit het logboek van Ivar


#Hier wordt de working directory gezet, dit wordt gedaan met setwd
setwd("/students/2024-2025/Thema05/3dconformatieChromatine/fastq")
(x = getwd())
#Hier wordt fastqc uitgevoerd op fq.dir = x, x is de eerder gezette wd. 
fastqc(fq.dir = x, qc.dir = "/students/2024-2025/Thema05/3dconformatieChromatine/fastqc_output/", fastqc.path = "/usr/bin/fastqc", threads = 100)
#ook wordt de output gezet via het qc.dir commando, waar fastqc staat word ook aangegeven met fastqc.path. Als laatste word de threads command gebruikt om aan te geven hoeveel threads gebruikt mogen worden.

Hier is de code voor multiqc - geschreven door Ivar & Storm

#hier staat print working directory
pwd
# hier wordt met cd../ gezorgt dat bash 1 directory terug gaat
cd ../
# deze cd lijd bash naar fastqc_output
cd fastqc_output
# hier wordt de working directory weer geprint
pwd
# hier wordt multiqc uitgevoerd op alle bestanden in de fastqc_output
multiqc .

MultiQC wordt hier gebruikt om naar alle fastqc output files te kijken. Multiqc zoekt een directory voor FastQC output en compileert deze files zodat de algemene resultaten over meerdere files beter te begrijpen is.

Figuuur 3: Ruwe data in multiQC
Figuuur 3: Ruwe data in multiQC

Hier is MultiQC te zien, het overlapt alle grafieken en maakt hier 1 grote grafiek van waar wanneer deze wordt aangeklikt het allemaal dingen laat zien. Deze dingen zijn de naam van de sample, welke base positie het is en de kwaliteit. 1 ding wat ook nog anders is, is de score naast de titel. De score naast de titel laat zien dat 8 samples wel een goede kwaliteit hebben en 7 niet.

Ook zijn de volgende samples zijn niet gebruikt:
B220+CD43+IgM- sorted primary pro-B cells.
Deze samples zijn verkregen met een Illumina MiSeq.

SRR26980527
SRR26980528
SRR26980529
SRR26980530

De reden hiervoor is dat het samples van WT muizen zijn, hier gaan we het referentiegenoom voor gebruiken.

Ook was de kwaliteit van deze sequenties volgens fastqc veel slechter dan die van de onderstaande samples. Mogelijk komt dit omdat de reads te lang waren en de kwaliteit daardoor te snel naar beneden ging.

De volgende zijn wel gebruikt:
Primary pro-B cells by CD19+ selection (Rag2-/-) Deze samples zijn verkregen met een Illumina NovaSeq 6000. SRR26980549
SRR26980550
SRR26980551
SRR26980552

De onnodige samples zijn ook verwijderd uit de lijst (SraAccList.csv) omdat deze met de pipe operator aan de parallel opdracht gegeven wordt. Als de namen in de accession lijst.

Om een gehele analyse te zien van de FastQC resultaten moet er gekeken worden naar de logboeken van Storm en Ivar

Test data maken

Seqkit - Is een veelzijdige tool voor het verwerken en analyseren van sequentiebestanden de inputs welke hij accepteert zijn FASTA en FASTQ. Het kan grote datasets efficiënt doorlopen en biedt meerdere functies zoals filtering, splitsen van sequenties, statistieken genereren, test data sets maken etc. De gebruikte versie op de bio inf assemblix server (waar de Rstudio commands op gerund worden) is op dit moment seqkit V2.3.0

Testdata - Test data is een essentieel deel van een onderzoek dit is om verschillende redenen, test data kan helpen om tools te valideren. Als de test data dezelfde resultaten geeft als de twee of meer echte data sets dan kan dit aangeven dat de tool niet goed werkt. Testdata kan ook worden gebruikt om de code in de bashscripts proef te runnen, dit omdat niet altijd alles goed gaat met de commando’s en inplaats van de echte data te beschadigen kan dit beter met test data.

Dit is dus ook de reden dat wij test data hebben gemaakt om te kijken of de resultaten verschillen met de test data of dat deze hetzelfde zijn met onze echte data.

De volgende code is gebruikt hiervoor

Deze code is geschreven door Floris, ik heb op de bin pc echter ook om het zelf te oefenen ook een test-data set gemaakt. alle code is hieronder te zien.


cd /run/media/floris/FLORIS_3/DATA_SETS/3D_Chromatine_Conformatie/DNA/SRA

seqkit head -n 10000 SRR26980527_1.fastq > subset_SRR26980527_1.fastq
seqkit head -n 10000 SRR26980527_2.fastq > subset_SRR26980527_2.fastq

#Code voor op de bin PC
cd /students/2024-2025/Thema05/3D_Chromatine_Conformatie/DNA/SRA

# Eerst hebben we geprobeerd om "sample" te gebruiken in plaats van head
seqkit sample -p SRR26980527_1.fastq > subset_SRR26980527_1.fastq

# Dit werkte echter niet heel goed dus hebben we uiteindelijk head gevonden en gebruikt

seqkit head -n 10000 SRR26980527_1.fastq > subset_SRR26980527_1.fastq

Seqkit is het aanroepen van het programma wat de testdata maakt, de reden om seqkit te gebruiken is omdat het een super snel programma is. Sneller dan een programma zoals pigz wat multi-threaded is.

head selecteert het deel van de originele data waarop de test-data moet worden gebaseerd, het gebruiken van head inplaats van sample is voor repliceerbaarheid en reproductie omdat het heel erg lijkt op de originele data.

-n geeft de lengte aan van hoeveel reads in de test data moet zitten.

Achtergrond Info verzameling

De reden om achtergrond informatie te verzamelen is om het onderzoek beter te kunnen uitleggen. Het referentie onderzoek gaat over verschillende dingen die niet vaak worden behandeld. 2 van die dingen zijn de A/B compartimenten. Deze hebben invloed op de activatie van het genooom. Pro-b cellen zijn ook een belangrijk onderwerp in het referentie onderzoek en ze zijn ook belangrijk voor ons onderzoek, dit is omdat wij kijken naar de EBF1 want de Pro-B cellen hebben dit nodig om te differentiëren van hematopoetische stamcellen naar volwassen B cellen. Wanneer dit gen dus minder voorkomt (ook wel tot expressie komt) kunnen de B cellen van de voorloper B cellen hebben.

A/B compartimenten

Harris et al. (2023)
Oji et al. (2024)

De nucleus van het humane genoom is verdeeld in verschillende ruimtelijke compartimenten. Actief chromatine bevindt zich doorgaans in het A-compartiment, terwijl inactief chromatine eerder geassocieerd is met het B-compartiment. Deze compartimentalisatie is geïdentificeerd met behulp van de Hi-C-methode, een techniek die de chromosomale organisatie in kaart brengt door op nabijheid gebaseerde interacties te combineren met hogedoorvoer sequencing. Het belang van de A- en B-compartimenten in ons onderzoek ligt in het feit dat Ebf1 (Early B-Cell Factor 1), een cruciale factor voor pro-B-cellen, van positie verandert tussen deze compartimenten naarmate het organisme (de muis) ouder wordt.

Het A compartiment is dus het compartiment waar de expressie actief is en hoge gen transcriptie plaats vindt. Voor zo ver wij weten ligt het A compartiment dicht bij het centrum echter is dit nog wel speculatie. Gen rijk, hoge GC-content, hebben histone markeringen voor actieve transcriptie.

Het B compartiment is de plek waar de expressie non actief is ook wel “silenced”, in het B compartimenten zitten niet veel genen, compact, hebben histone markeringen voor silencing en bestaan het meeste uit LADs en bevatten late replication origins.

TADs - Er wordt gesugereerd dat deze een grote invloed hebben op gen regulatie en dat ze belangrijk zijn voor embryonaal ontwikkeling. Ook werd gezien dat lange afstand regulatie van gen expressie niet allen leunt op TADs en hun grenzen.

Sub compartimenten - Er wordt gesuggereerd dat er binnen de twee compartimenten nog kleinere subcompartimenten zitten. Elk compartiment werd geobserveerd met verschillend histone modificatie patronen en RT. wat suggereert dat elke chromatine met gelijke karakteristieken in elkaar wordt gezet om verschillende interactie eenheden binnen de A en B compartimenten. Er is op het moment nog niet gevonden of er een link tussen de subcompartimenten ligt en het feitelijke nucleare oriëntatiepunten.

Pro B-cell

Pro-B cellen ontstaan in het beenmerg van progenitor cellen naar de B-cell lineage. elke pro-B cell ondergaat onafhankelijke herordening en op bouwing van diverse variabelen, diversiteit en “joining” gen segmenten van de immunoglobuline zware (H)- keten locus.

Kritisch voor de generatie van het verschillend repertoire van b cellen capabel in het herkennen van een wijde varia aan pathogene. De pro-B cell veranderd naar de pre-B cell dit gebeurd wanneer de zware immunoglobuline keten her georganiseerd is.

Nemazee (2017)

Indexeren referentie genoom

Met alleen een fastq bestand is het niet duidelijk waar in het genoom van de mm39 muis deze reads vandaan komen. Om hier achter te komen moet read mapping worden gebruikt, Hier worden de reads ook wel data-sequenties vergeleken met een bekend genoom. Het genoom in ons referentie onderzoek kwam uit 2012 het GRCm38 en dit onderzoek kijkt naar GRCm39 waardoor er dus verschillen kunnen zijn in de varianten

Hier wordt ons gekozen referentie genoom ge indexeert. De reden voor het alignen van het referentie genoom is voor het gebruik van BWA-mem2. een geïndexeerde versie van het refentiegenoom moet dus gemaakt worden, dit kan met bwa-mem2 index. indexeren maakt het align proces veel sneller. De samples SRR26980528_1 en _2 zijn gebruikt na het referentiegenoom te indexeren met BWA_MEM2. Het gebruikte referentie genoom is mm39 (GCF_000001635.27).

In de onderstaande code chunk wordt het geïndexeerde muisgenoom “testnaam” genoemd. Daarna worden twee samples (forward read en reverse read) ge-aligned met het zojuist verkregen geïndexeerde referentiegenoom.

D

Wat hier uit komt is een SAM file deze ziet er als volgt uit:

@HD VN:1.6 SO:coordinate - De header met de specifieke versie van het SAM format 1.6 dus @SQ SN:ref LN:45 - Nog een header met de SN ook wel sequentie naam en de LN ook wel lengthe Hier onder zijn de alignment records te zien
r001 99 ref 7 30 8M2I4M1D3M = 37 39 TTAGATAAAGGATACTG * r002 0 ref 9 30 3S6M1P1I4M * 0 0 AAAAGATAAGGATA * r003 0 ref 9 30 5S6M * 0 0 GCCTAAGCTAA * SA:Z:ref,29,-,6H5M,17,0; r004 0 ref 16 30 6M14N5M * 0 0 ATAGCTTCAGC * r003 2064 ref 29 17 6H5M * 0 0 TAGGC * SA:Z:ref,9,+,5S6M,30,1; r001 147 ref 37 30 9M = 7 -39 CAGCGGCAT * NM:i:1

r001, r002 zijn de read names, de nummers er achter zijn de bitwise flag values welke informatie over de reads geeft zoals of het paired is of unmapped. 30 is de kwaliteit score voor de alignment. De letter en cijfer mix zoals “8M2I4M1D3M” zijn de CIGAR string die beschrijven hoe de read alignen naar de ref M = match, I = insertion, D = deletion, S = soft clipping, P = padding. Daarna zijn de reads te zien en het andere optionele veld voor allignment scores of alternatieve alignments.

https://samtools.github.io/hts-specs/SAMv1.pdf

Deze code is geschreven door floris.



cd /run/media/floris/FLORIS_3/DATA_SETS/3D_Chromatine_Conformatie/DNA/SRA


# Het indexeren van het referentiegenoom met bwa-mem2. 
bwa-mem2 index -p testnaam referentiegenoom

# Voorbeeld aligning:
bwa-mem2 mem ref.fa read1.fq read2.fq > aln-pe.sam

# Align sample SRR26980549_1.fastq (deel 1 en 2) met het referentiegenoom mm39 muis. 
./bwa_mem2/bwa-mem2-2.2.1_x64-linux/bwa-mem2 mem -p 60 testnaam fastq/SRR26980549_1.fastq fastq/SRR26980549_2.fastq > aligned_SRR26980549.sam &

# find /run/media/floris/FLORIS_3/DATA_SETS/3D_Chromatine_Conformatie/DNA/SRA -name "*.sra" | \
#   parallel fasterq-dump -O /run/media/floris/FLORIS_3/DATA_SETS/3D_Chromatine_Conformatie/DNA/SRA/FASTQ {}

Bij deze indexering is een aligned bestand verkegen wat een .sam file is, dit bestand is tekst met een header en een alignment deel. Deze file heeft de sequenties die aligned zijn tegen het refentie sequentie opgeslagen. Omdat de .SAM niet georderd zijn op positie in het genoom moeten ze eerst met samtools sort omgezet worden naar een .BAM bestand (kijk naar het logboek van floris voor een diepere uitleg) de reden om dit te doen is dat het opvragen van data sneller gemaakt word als het geïndexeerd is.

Samtools versie 1.16.1 is gebruikt dit is een collectie van tools om high-throughpout sequence data te werken. Het kan verschillende dingen zoals WGS/WES mapping naar variant calls en het filteren van .vcf bestanden. Samtools-Markdup(1) Manual Page (n.d.)

-O BAM geeft het format aan, samtools sort -n zorgt dat de .sam gesorteerd worden op read naam (De QNAME kolom in het bestand)

BAM files zijn niet humaan leesbaar dus om te begrijpen wat er in staat is hier een foto voor uitleg.

Bron: https://samtools.github.io/hts-specs/SAMv1.pdf

Deze code is geschreven door floris

# Voor een enkel sample:
samtools sort -n -O BAM -o aligned_sorted_SRR26980549.bam aligned_SRR26980549.sam

# Met parallel:
cat /students/2024-2025/Thema05/3dconformatieChromatine/SRA/SraAccList.csv | parallel 'samtools sort -n -O BAM -o aligned_sorted_{}.bam aligned_{}.sam ' &

“fixmate -m” voegt score tags toe die gebruikt worden door markdup om de beste reads te selecteren om te behouden.

Met “—Threads” wordt het aantal threads gespecificeerd dat de computer moet gebruiken voor dit commando. Samtools-Markdup(1) Manual Page (n.d.)

De reden waarom je de mate-informatie wil corrigeren en mogelijke duplicaten wil weten is omdat je wil dat de paired-end reads goed worden geïnterpreteerd. Dit betekent dat je geen valse positieve of valse mutaties wil dit zou namelijk het onderzoek comprimeren. Het er uit halen van duplicaten en het corrigeren van de mate-info zorgt dus voor meer nauwkeurigheid en betrouwbaarheid van de “downstream” analyses zoals variant detectie in ons geval.

Deze code is geschreven door floris

# Voor een enkel sample:
samtools fixmate -m --threads 16 aligned_sorted_SRR26980549.bam \ fixed_mates_aligned_sorted_SRR26980549.bam

# Met parallel:
cat /students/2024-2025/Thema05/3dconformatieChromatine/SRA/SraAccList.csv | parallel 'samtools fixmate -m --threads 16 aligned_sorted_{}.bam fixed_mates_aligned_sorted_{}.bam' &

Met samtools markdup worden duplicaten gemarkeerd. Met het “-r” argument worden deze verwijderd en met “-s” worden statistieken over de data en uitgevoerde handelingen.

Bron: Samtools-Markdup(1) Manual Page (n.d.)

Deze code is geschreven door floris

markdup, is het commando in samtools om markdup aan te roepen, markdup zoekt naar duplicaten in BAM-bestanden

-r, deze optie zorgt voor dat duplicaten worden “removed” ook wel verwijderd uit het bestand. Zonder deze optie zouden de duplicaten alleen worden gemarkeerd.

-s, deze optie zorgt dat informatie over de duplicaten naar STDERR (foutuitvoer) geschreven worden, dit is handig voor loggen en trouble shooten.

sorted_coordinates_SRR26980549.bam, dit is het input BAM bestand waarin de reads op hun genoomcoördinaten zijn gesorteerd. Zonder dit bestand werkt markdup niet

dedup_SRR26980549.bam, dit is het output BAM bestand waarin de dupicaten zijn gemarkeerd en in ons geval ook verwijderd.

De reden om markdup te gebruiken en dus de duplicaten te markeren en verwijderen is, voor meer nauwkeurigheid in de data, ook de betrouwbaarheid van de downstream analyse wordt hoger.

# Voor een enkel sample:
samtools markdup -r -s sorted_coordinates_SRR26980549.bam dedup_SRR26980549.bam

# Met parallel:
cat /students/2024-2025/Thema05/3dconformatieChromatine/SRA/SraAccList.csv | parallel  'samtools markdup -r -s sorted_coordinates_{}.bam dedup_{}.bam' &

Met samtools index wordt er een index bestand gemaakt bij elke sample

index, dit is het commando om indexing aan te roepen in de samtools toolkit.

verder zijn de input en ouput sample te zien dedup_SRR26980549.bam en dedup_SRR26980549.bai er is wel iets veranderd aan de extensie. Het is van .bam naar .bai gegaan, de afkorting .bai staat voor BAM index

Als laatste is de & te zien, dit zorgt ervoor dat het bash script op de achtergrond wordt uitgevoerd.

De reden om de samples te indexen is omdat geïndexeerde bestanden sneller zijn, dit in de zin van zoeken naar specifieke regios. In een geïndexeerd bestand is het mogelijk om direct specifieke delen te bezoeken, voor sommige programa’s is het ook een vereiste om geïndexeerde data te hebben. Dit zijn programmas zoals IGV (Integrative Genomics Viewer) waar visueel naar data gekeken word. Kortom efficiëntie

Een BAI ook wel BAM index file is een binair file, hier is een voorbeeld van hoe een bai file er uit kan zien

Deze code is geschreven door floris

# Voor een enkel sample:
samtools index dedup_SRR26980549.bam dedup_SRR26980549.bai  &

# Met parallel:
cat /students/2024-2025/Thema05/3dconformatieChromatine/SRA/SraAccList.csv | parallel 'samtools index dedup_{}.bam dedup_{}.bai' &

Bron: https://github.com/freebayes/freebayes Met behulp van het onderstaande stuk code worden de resulaten van de freebayes variant calling direct gefilterd op kwaliteit met vcffilter. Met “QUAL = 20” worden enkel de variants geselecteerd die 99% kans hebben dat er een variant zit op die plaats.

Freebayes - is de tool die gebruikt wordt om genetische varianten te detecteren ook wel “variant calling” de gebruikte versie is 1.3.6 op linux

-f, deze optie geeft het referentie genoom aan dat gebruikt wordt bij het vergelijken van de sequentie-reads. Freebayes gebruikt dit referentiegenoom (referentie genoom is GRCm39) om genetische varianten te detecteren.

Het dedup_SRR26980549.bam bestand is het bestand wat als input wordt gebruikt, freebayes kijkt in deit bestand de uitgelijnde reads om genetische varianten te detecteren

Het “|” symbool is een pipe, waarmee de uitvoer van freebayes gelijk doorgegeven wordt aan vcffilter zonder een tussenbestand te maken.

vcffilter, dit is een tool die wordt gebruikt om VCF-bestanden te filteren op basis van bepaalde criteria. In ons geval gebruiken wij vcffilter-assembly-0.2 jar. de criteria die wij hebben gezet is een minimale kwaliteit hoger dan 20 dit wordt gedaan met “QUAL > 20”

De reden om een VCF-bestand ook wel Variant Call Format te maken is het opslaan van genetische varianten. Het VCF bestand is essentieel voor de visualisatie die wij later gaan doen.

Hier is een voorbeeld van hoe een VCF-bestand er uit kan zien:

##fileformat=VCFv4.3 - Hier staat het Format en de versie
##fileDate=20090805 - De datum van generatie van deze file
##source=myImputationProgramV3.1 - source tool waarmee de VCF is genmaakt
##reference=file:///seq/references/1000GenomesPilot-NCBI36.fasta - referentie genoom gebruikt voor variant zoeken
##contig<ID=20,length=62435964,assembly=B36,md5=f126cdf8a6e0c7f379d618ff66beb2da,species=“Homo sapiens”,taxonomy=x> - ID van chromosoom of scaffold + lengthe in base paren.
##phasing=partial - het proces van toewijzen van allelen aan de chromosomen
##INFO=<ID=NS,Number=1,Type=Integer,Description=“Number of Samples With Data”> 
##INFO=<ID=DP,Number=1,Type=Integer,Description=“Total Depth”> 
##INFO=<ID=AF,Number=A,Type=Float,Description=“Allele Frequency”> 
##INFO=<ID=AA,Number=1,Type=String,Description=“Ancestral Allele”> 
##INFO=<ID=DB,Number=0,Type=Flag,Description=“dbSNP membership, build 129”> 
##INFO=<ID=H2,Number=0,Type=Flag,Description=“HapMap2 membership”> 
##FILTER=<ID=q10,Description=“Quality below 10”> 
##FILTER=<ID=s50,Description=“Less than 50% of samples have data”> 
##FORMAT=<ID=GT,Number=1,Type=String,Description=“Genotype”> 
##FORMAT=<ID=GQ,Number=1,Type=Integer,Description=“Genotype Quality”> 
##FORMAT=<ID=DP,Number=1,Type=Integer,Description=“Read Depth”> 
##FORMAT=<ID=HQ,Number=2,Type=Integer,Description=“Haplotype Quality”> 
#CHROM POS      ID         REF   ALT    QUAL  FILTER   INFO                             FORMAT       NA00001         NA00002          NA00003 
20     14370    rs6054257  G     A      29    PASS    NS=3;DP=14;AF=0.5;DB;H2           GT:GQ:DP:HQ  0|0:48:1:51,51  1|0:48:8:51,51   1/1:43:5:.,. 
20     17330    .          T     A      3     q10     NS=3;DP=11;AF=0.017               GT:GQ:DP:HQ  0|0:49:3:58,50  0|1:3:5:65,3     0/0:41:3 
20     1110696  rs6040355  A     G,T    67    PASS    NS=2;DP=10;AF=0.333,0.667;AA=T;DB GT:GQ:DP:HQ  1|2:21:6:23,27  2|1:2:0:18,2     2/2:35:4 
20     1230237  .          T     .      47    PASS    NS=3;DP=13;AA=T                   GT:GQ:DP:HQ  0|0:54:7:56,60  0|0:48:4:51,51   0/0:61:2 
20     1234567  microsat1  GTC   G,GTCT 50    PASS    NS=3;DP=9;AA=G                    GT:GQ:DP     0/1:35:4        0/2:17:2         1/1:40:3 

# Voor een bestand:
/students/2024-2025/Thema05/3dconformatieChromatine/freebayes/freebayes-1.3.6-linux-amd64-static \
 -f /students/2024-2025/Thema05/3dconformatieChromatine/Mapping_ref/ncbi_dataset/ncbi_dataset/data/GCA_000001635.9/GCA_000001635.9_GRCm39_genomic.fna dedup_SRR26980549.bam | /students/2024-2025/Thema05/3dconformatieChromatine/vcffilter/vcffilter-assembly-0.2.jar -f "QUAL > 20" > filtered_SRR26980549.vcf
 
 
# Met parallel: 
cat /students/2024-2025/Thema05/3dconformatieChromatine/SRA/SraAccList.csv | parallel '/students/2024-2025/Thema05/3dconformatieChromatine/freebayes/freebayes-1.3.6-linux-amd64-static \
 -f /students/2024-2025/Thema05/3dconformatieChromatine/Mapping_ref/ncbi_dataset/ncbi_dataset/data/GCA_000001635.9/GCA_000001635.9_GRCm39_genomic.fna dedup_{}.bam | /students/2024-2025/Thema05/3dconformatieChromatine/vcffilter/vcffilter-assembly-0.2.jar -f "QUAL > 20" > filtered_{}.vcf' &

Om alle paired read samples te mappen is het onderstaande bash script gebruikt. Hier is weer het parallel commando voor gebruikt. De lijst met sample namen wordt aan bwa-mem2 gegeven zodat het programma naar input bestanden met deze namen kan kijken en de gegenereerde .sam bestanden ook deze naam te geven.

#cat concatinate de sraacclist en geeft het mee aan parallel
cat /students/2024-2025/Thema05/3dconformatieChromatine/SRA/SraAccList.csv |
#parallel zorgt dat de tool tegelijkertijd uit gevoerd wordt. hier voert het voor elk sample in de lijst het bw-mem2 commando uit
parallel '/students/2024-2025/Thema05/3dconformatieChromatine/bwa_mem2/bwa-mem2-2.2.1_x64-linux/bwa-mem2 mem -t 60 testnaam /students/2024-2025/Thema05/3dconformatieChromatine/fastq/{}_1.fastq /students/2024-2025/Thema05/3dconformatieChromatine/fastq/{}_2.fastq > /students/2024-2025/Thema05/3dconformatieChromatine/mapping/{}.sam' &

bwa-mem2 mem roept het programma bwa-mem2 aan dit wordt gebruikt om de illumina sequenties te mappen

-t 60 geeft aan dat het proces 60 threads moet gebruiken om de snelheid te verhogen. Dit is handig om te doen voor uitlijning van grote hoeveelheden data omdat het dan sneller verwerkt wordt.

/students/2024-2025/Thema05/3dconformatieChromatine/fastq/{}_1.fastq en /students/2024-2025/Thema05/3dconformatieChromatine/fastq/{}_2.fastq geeft de paths naar de fastq input bestanden weer.

/students/2024-2025/Thema05/3dconformatieChromatine/mapping/{}.sam geeft de path waar de output bestanden heen moeten

& dit zet het hele parallel-proces op de achtergrond zodat de shell beschikbaar is tijdens het proces.

Week 3 - Data Trimming & 2de kwaliteit check

Doelen van de week

Data trimmen

Quality herchecken

Variantie detectie

Taken lijst

  • Fastq quality checken en kijken hoe de data moet worden getrimd
  • Data trimmen
  • Freebayes script schrijven

Trimmomatic

Trimmomatic is een flexibel trimsoftware voor illumina sequence data, het kan zowel paired-end als dsingle ended data aan. Er zijn verschillende stappen in het trimmen en verschillende parameters. Trimmomatic is een command line gerunde tool. De voordelen van trimmomatic zijn dat het goed omgaat met het “collapsing” en “trimming” van paired-end en sequencing van fragmenten die korten zijn dan de leeslengte, waarbij de leeslengte zich aan het einde van elke leeslengte uitstrekt tot in de adapters. Het zorgt ook dat terwijl het de data schoonmaakt zijn intergriteit behoud.

Het trimmen van de data is nodig omdat zoals te zien in het logboek van Storm en Ivar de kwaliteit van onze data niet hoog is. Om dit te verbeteren moeten wij trimmen, de reden dat wij hogere kwaliteit data willen is omdat er geen conclusie kan worden getrokken uit slechte kwaliteit data omdat het fout kan zijn. De Trimmomatic is goed aan te passen en kan adapters weghalen deze twee dingen zijn essentieel dit omdat onze data is gesequenced uit ilumina apparatuur wat dus kan betekenen dat het ilumina adapters heeft, en omdat wij specifieke aanpassingen willen maken die met trimmomatic goed kunnen worden gedaan.


cat data/GSE149995_Sra_RunInfo.csv | \
  parallel 'TrimmomaticPE -threads 16 ' \
                  '/students/2024-2025/Thema05/3dconformatieChromatine/fastq/{}.fastq.gz ' \
                  '/students/2024-2025/Thema05/3dconformatieChromatine/fastq-trimmed/{}.trimmed.fastq.gz ' \
                  'ILLUMINACLIP:/homes/marcelk/Development/2.1.2-Transcriptomics/TruSeq3-SE.fa:2:30:10 ' \
                  'MINLEN:40 ' \
                  'SLIDINGWINDOW:4:20'

Hier is het bash script te zien dat wij hebben gebruikt om onze data te trimmen. Eerst is de cat command te zien dit is ook wel concatenate dit read de file en print zijn content. Het leest de GSE149995_Sra_RunInfo deze file is belangrijk omdat het metadata bevat over de sequenceing runs die gedowload zijn uit de SRA database, er kunen dingen instaan zoals Sample names, Sequencing platform, Run accesion numbers en nog andere data.

parallel is een command dat trimomatic meerdere cores tegelijk moet gebruiken, dit doen wij omdat het programma dan sneller de data kan verwerken.

Met -threads 16 word aangegeven dat het 16 threads mag gebruiken.

Met TrimmomaticPE wordt trimmomatic aangeroepen, verder zijn 2 andere belangerijke dingen de { } is om de trimmomatic te automatiseren dit doet hij door alle files in de map fastq te nemen die eindigen met .fastq.gz en de output van trimmomatic naar de fastq-trimmed map te zetten.

Het andere belangrijke is de MINLEN en Slidingwindow commando’s. Minlen laat de reads vallen wanneer het onder een bepaalde lengte is.

Slidingwindow het zorgt ervoor dat trimmomatic snijdt zodra de gemiddelde kwaliteit binnen het venster onder een drempelwaarde komt.

Er zijn ook een paar samples niet gebruikt. Dit zijn de: B220+CD43+IgM- sorted primary pro-B cells. Deze samples zijn verkregen met een illumina MiSeq.

SSR26980527
SSR26980528
SSR26980529
SSR26980530

De reden dat we deze niet gebruiken is omdat het samples van WT muizen zijn, We gaan hier het referentiegenoom voor gebruiken. De kwaliteit van deze sequenties was volgens fastQC veel slechter dan de onderstaande samples. Dit kan mogelijk komen omdat de reads te lang waren waardoor de kwaliteit snel daalde.

De volgende samples zijn wel gebruikt. Dat zijn: Primary pro-B cells by CD19+ selection (RAg2-/-) Deze sa,ples zijn verkregen met een illumina NovaSeq 6000

SRR26980549.sam
SRR26980550.sam
SRR26980551.sam
SRR26980552.sam

De samples die onnodig waren zijn ook verwijderd uit de SraAccList.csv omdat deze met de pipe operator interveren, dit kan voor problemen zorgen of overbodige belasting.

Voor diepere analyse check het logboek van Storm en Ivar

Flow chart voor Paired End mode.

Figuur 4 : Flow of reads in Trimmomatic - Paired End mode

Deze flowchart toont hoe Trimmomatic paired-end reads verwerkt. Het programma neemt beide reads als input en beoordeelt hun kwaliteit. Als zowel de forward als reverse reads voldoen aan de gekozen settings, blijven ze “paired” voor verdere analyse. Als één van de twee niet aan de kwaliteitsnormen voldoet wordt de slechte read verwijderd en de goede read als “unpaired” opgeslagen. Hierdoor onstaan vier mogelijkheden voor outputs: forward paired, reverse paired, forward unpaired en reverse unpaired. Allemaal afhankelijk van de kwaliteit van elke read.

Fastqc run 2

Deze tweede FastQC run is gedaan na het mappen van de data.

Figuur 5: multiQC view van fastq files na Trimmomatic
Figuur 5: multiQC view van fastq files na Trimmomatic

Hier is de data te zien nadat deze getrimmed is, er zijn een paar dingen veranderd: We hebben nog maar 8 files van ongeveer 150 bp lang.

Conclusie FastQC run 2

De conclusie van de fastqc rapport is dat de samples 549, 550, 551, 551 goed zijn op het gebied van de algemene sequentie kwaliteit. Alleen deze samples laten een aantal bijzonderheden zien die we niet helemaal kunnen verklaren, maar hoogstwaarschijnlijk niet ernstig genoeg zijn om de verdere stappen te kunnen beinvloeden.

Voor verdere analyse zie logboek van Ivar of Storm

Align data

Sorteren .sam bestanden

Bwa-mem2

BWA-MEM2 wordt gebruikt om zowel DNA- als RNA-reads te aligneren met een referentiegenoom. Het kan korte en middellange DNA- of RNA-reads alignen. Er zijn verschillende manieren waar dit voor gebruikt kan worden zoals, Whole genome sequencing, Exoomsequencing en RNA-seq. Voor ons is Whole genome sequencing interresant dit is omdat hierbij de genomen worden gescand en dan vergeleken met het gekozen referentie genoom (in ons geval mm39 - GCF_000001635.27) dit om genetische variaties te identificeren.

BWA-MEM2 heeft een geïndexeerde versie nodig van ons referentie genoom, deze moet dus eerst gemaakt worden. Dit kan gedaan worden met bwa-mem2 index, nog een plus punt is het indexeren maakt het align proces veel sneller. De samples SRR26980528_1 en _2 zijn gebruikt na het referentiegenoom te indexeren. Het gebruikte referentie genoom is mm39 - GCF_000001635.27 in ons geval heet deze file “testnaam”

Deze code is geschreven door Floris deze is te vinden in zijn logboek - Deze code is voor de aligning van de data.

Eerst is cat te zien ook wel concatenate dit read de file en print zijn content, dan is parallel te zien deze runt de workload over meerdere cores. Dan is te zien dat we een path aangeven specifiek naar bwa-mem2 omdat deze is geinstalleerd in deze speicifieke map, met mem roepen we de allignment modus aan welke bwa moet gebruiken deze modus is goed voor reads die door illumina machines zijn gesequenced. Het volgende wat te zien is is een -t 50 dit geeft aan hoeveel threads bwa moet gebruiken, testnaam refereent naar het geindexeerde referentie genoom. Dan zijn weer 2 paths te zien, deze referen naar de forward en reverse strands en de {} is om te zorgen dat het alle files in de map kan lezen zodat het eigenlijk de gehele map automatisch doet. De laatst path is voor de output en de laatste character “&” is zodat dit op de achtergrond gebeurd.

cat /students/2024-2025/Thema05/3dconformatieChromatine/SRA/SraAccList.csv | parallel /students/2024-2025/Thema05/3dconformatieChromatine/bwa_mem2/bwa-mem2-2.2.1_x64-linux/bwa-mem2 mem -t 50 testnaam /students/2024-2025/Thema05/3dconformatieChromatine/Trimmomatic_output/paired/{}_forward_paired.fastq /students/2024-2025/Thema05/3dconformatieChromatine/Trimmomatic_output/paired/{}_rev_paired.fastq > /students/2024-2025/Thema05/3dconformatieChromatine/mapping/{}.sam &

De reden waarom wij bwa-mem2 gebruiken en niet STAR is omdat bwa-mem2 beter is voor DNA dit is omdat STAR gespecialiseerd is in RNA-seq ook is bwa-mem2 heel accuraat voor DNA sequences allignment, het gaat goed om met mismatches, kleine indels en langere reads. Het voordeel van bwa-mem2 is ook dat het minder zwaar is op de memory van de pc’s.

Converteer SAM naar BAM

samtools sort -n -O BAM -o aligned_sorted_SRR26980549.bam aligned_SRR26980549.sam

# Met parallel:
cat /students/2024-2025/Thema05/3dconformatieChromatine/SRA/SraAccList.csv | parallel samtools sort -n -O BAM -o aligned_sorted_{}.bam aligned_{}.sam  &

Ondanks dat de .bam eerst staat en dan de .sam worden de sam files naar bam omgezet.

cat /students/2024-2025/Thema05/3dconformatieChromatine/SRA/SraAccList.csv, leest de lijst van sample-namen uit het SraAccList CSV bestand, dit bestand bevat de accessienummers bijvoorbeeld SRR26980550.

samtools sort -n -O BAM -o aligned_sorted_{}.bam aligned_{}.sam: dit is het sorteer commando wat uitgevoerd wordt, id de parallel staan inplaats van de bestand namen alleen de {} en de file type in dit geval .bam & .sam. Dit zorgt dat samtools kijkt in de map waar het uitgevoerd wordt er gezocht naar alleen bestanden die voldoen aan de filter eisen dus iets waar “aligned_sorted_” in staat, dan de {} dus de sample naam waarschijnlijk en dan de .bam afkorting.

&, dit zorgt ervoor dat het script op de achtergrond gerund word waardoor er verder gewerkt kan worden terwijl dit script runt.

De reden om de aligned files om te zetten van .sam naar .bam is omdat deze worden gebruikt om een bed file te maken. Ook zijn er voordelen aan bam bestanden tegenover sam bestanden dit zijn: minder opslagruimte, meer compatibiliteit en sneller lees baar door verschillende tools.

Freebayes - variant calling

“FreeBayes DNAseq Workflow” (n.d.)

Freebayes is een “Bayesian” genetische variant detector gemaakt om kleine “poylmorphisms” (de aanwezigheid van twee of meer varianten van een specifieke DNA-sequentie), in het specifiek SNPs (single-nucleotide polymorphisms), indels (insersties en verwijderingen), MNPs (multi-nucleotide polymorphisms), en complexe evenementen (composite insertion and substitution events) kleiner dan de lenghte van een short-red sequencing alignment.

freebayes is haplotype-gebaseerd, in de manier waarop het varianten called gebaseerd op de leterlijke sequenties van reads ge aligned naar een specifieke target, niet hun exacte alignment. Dit model is een eenvoudige generalisatie van eerdere modellen (bijv. PolyBayes, samtools, GATK) die varianten detecteren of rapporteren op basis van alignments. Deze methode vermijdt een van de kernproblemen met alignment-based variant detection— dat identieke sequenties meerdere mogelijke alignments kunnen hebben.

Voordat de freebayes echt bezig kan moeten er nog wel een paar bestanden aangepast worden.

/students/2024-2025/Thema05/3dconformatieChromatine/freebayes/freebayes-1.3.6-linux-amd64-static -f GCA_000001635.9_GRCm39_genomic.fna \ /students/2024-2025/Thema05/3dconformatieChromatine/aligned_sorted_SRR26980549.bam > \ 
/students/2024-2025/Thema05/3dconformatieChromatine/variant_calling/SRR26980549_test.vcf

De code hier activeert eerst de freebayes door naar het path te gaan waar freebayes is geinstalleerd en deze aan te roepen, -f geeft aan welk referentie genoom freebayes moet gebruiken wij linken hier naar het GCA_000001635.9_GRCm39_genomic.fna ref genoom wat de m39 versie is van het muis genoom. Daarna gaan we naar het aligned_sorted_SRR26980549.bam file, deze file is de ge aligneerde sequence file.

samtools faidx GCA_000001635.9_GRCm39_genomic.fna 

Faidx, dit is een commando van samtools dat gebruikt wordt om een FASTA-index te generen voor het referentiegenoom in FASTA-formaat

GCA_000001635.9_GRCm39_genomic.fna is het referentie genoom in fasta formaat waar de indexering op wordt toegepast.

Een .fai bestand bevat info over de volgorde van de sequenties in het FASTA-bestand, zoals de namen van de chromosomen, de lengte van de sequenties en waar deze zich bevinden in het bestand. dit maakt snelle toegang to specifieke chromosomen of sequenties mogelijk zonder het hele fasta bestand in het geheugen te hoeven laden.

hier een voorbeeld van hoe het er uit zou kunnen zien.

chr1 195471974 52 60 61

chr1 195471971 52 60 61

De reden om dit bestand te maken is voor noodzaak bij bepaalde tools down stream.

Week 4 - Visualisatie

Annotatie

Gen annotatie Eerst is er een .bed bestand van het niet door mensen leesbare .bam bestand gemaakt, daarna zijn de genen geannoteerd zodat ze geen namen hebben zoals: SRR26980549.46263152/2 maar …. Met behulp van bamToBed wordt het .bam bestand omgezet naar een .bed (Browser extensible data). De eerste kolom van een .bed bevat de naam van het chromosoom, de tweede kolom het start coördinaat van de feature, de derde kolom het eind coördinaat van de feature, 4e kolom de naam, daarna optioneel een score en dan de streng (-/+). bron: https://genome.ucsc.edu/FAQ/FAQformat.html


bamToBed -i aligned_sorted_SRR26980549.bam > aligned_sorted_SRR26980549.bed

Visualisatie

verschillende soorten visualisatie proberen

#hier vraag ik of Biocmananger al is geinstaleerd en of het nodig is zo ja dan wordt het geinstalleerd met de quitly=TRUE wordt dit op de achtergrond gedaan.
if (!require("BiocManager", quietly = TRUE))
    install.packages("BiocManager")
## Warning: package 'BiocManager' was built under R version 4.4.1
#hier gebruik ik BiocManager om Variantannotation te instaleren
BiocManager::install("VariantAnnotation")
## Bioconductor version 3.19 (BiocManager 1.30.25), R 4.4.0 (2024-04-24 ucrt)
## Warning: package(s) not installed when version(s) same as or greater than current; use
##   `force = TRUE` to re-install: 'VariantAnnotation'
## Installation paths not writeable, unable to update packages
##   path: C:/Program Files/R/R-4.4.0/library
##   packages:
##     boot, foreign, KernSmooth, MASS, Matrix, nlme, survival
## Old packages: 'bookdown', 'cli', 'colorspace', 'data.table', 'digest',
##   'evaluate', 'GenomicRanges', 'gert', 'glue', 'jsonlite', 'officer',
##   'rstudioapi', 'xfun', 'yaml'

VariantAnnotation is een library die kijkt naar VCF files en er bepaalde dingen uit kan lezen die te maken hebben met Varianten. Dit wordt gehost door Biocoductor https://bioconductor.org/packages/release/bioc/html/VariantAnnotation.html er staat een kort maar krachtige uitleg van wat het kan: Annotatering van varianten, computeert amino zuur codering veranderiongen, voorspelling uitkomst van codering.

#hier wordt de eerder geinstaleerde Variannotatie library aangeroepen
library(VariantAnnotation)
## Loading required package: BiocGenerics
## 
## Attaching package: 'BiocGenerics'
## The following objects are masked from 'package:dplyr':
## 
##     combine, intersect, setdiff, union
## The following objects are masked from 'package:stats':
## 
##     IQR, mad, sd, var, xtabs
## The following objects are masked from 'package:base':
## 
##     anyDuplicated, aperm, append, as.data.frame, basename, cbind,
##     colnames, dirname, do.call, duplicated, eval, evalq, Filter, Find,
##     get, grep, grepl, intersect, is.unsorted, lapply, Map, mapply,
##     match, mget, order, paste, pmax, pmax.int, pmin, pmin.int,
##     Position, rank, rbind, Reduce, rownames, sapply, setdiff, table,
##     tapply, union, unique, unsplit, which.max, which.min
## Loading required package: MatrixGenerics
## Loading required package: matrixStats
## Warning: package 'matrixStats' was built under R version 4.4.1
## 
## Attaching package: 'matrixStats'
## The following object is masked from 'package:dplyr':
## 
##     count
## 
## Attaching package: 'MatrixGenerics'
## The following objects are masked from 'package:matrixStats':
## 
##     colAlls, colAnyNAs, colAnys, colAvgsPerRowSet, colCollapse,
##     colCounts, colCummaxs, colCummins, colCumprods, colCumsums,
##     colDiffs, colIQRDiffs, colIQRs, colLogSumExps, colMadDiffs,
##     colMads, colMaxs, colMeans2, colMedians, colMins, colOrderStats,
##     colProds, colQuantiles, colRanges, colRanks, colSdDiffs, colSds,
##     colSums2, colTabulates, colVarDiffs, colVars, colWeightedMads,
##     colWeightedMeans, colWeightedMedians, colWeightedSds,
##     colWeightedVars, rowAlls, rowAnyNAs, rowAnys, rowAvgsPerColSet,
##     rowCollapse, rowCounts, rowCummaxs, rowCummins, rowCumprods,
##     rowCumsums, rowDiffs, rowIQRDiffs, rowIQRs, rowLogSumExps,
##     rowMadDiffs, rowMads, rowMaxs, rowMeans2, rowMedians, rowMins,
##     rowOrderStats, rowProds, rowQuantiles, rowRanges, rowRanks,
##     rowSdDiffs, rowSds, rowSums2, rowTabulates, rowVarDiffs, rowVars,
##     rowWeightedMads, rowWeightedMeans, rowWeightedMedians,
##     rowWeightedSds, rowWeightedVars
## Loading required package: GenomeInfoDb
## Loading required package: S4Vectors
## Warning: package 'S4Vectors' was built under R version 4.4.1
## Loading required package: stats4
## 
## Attaching package: 'S4Vectors'
## The following objects are masked from 'package:dplyr':
## 
##     first, rename
## The following object is masked from 'package:utils':
## 
##     findMatches
## The following objects are masked from 'package:base':
## 
##     expand.grid, I, unname
## Loading required package: IRanges
## Warning: package 'IRanges' was built under R version 4.4.1
## 
## Attaching package: 'IRanges'
## The following objects are masked from 'package:dplyr':
## 
##     collapse, desc, slice
## The following object is masked from 'package:grDevices':
## 
##     windows
## Loading required package: GenomicRanges
## Loading required package: SummarizedExperiment
## Loading required package: Biobase
## Welcome to Bioconductor
## 
##     Vignettes contain introductory material; view with
##     'browseVignettes()'. To cite Bioconductor, see
##     'citation("Biobase")', and for packages 'citation("pkgname")'.
## 
## Attaching package: 'Biobase'
## The following object is masked from 'package:MatrixGenerics':
## 
##     rowMedians
## The following objects are masked from 'package:matrixStats':
## 
##     anyMissing, rowMedians
## Loading required package: Rsamtools
## Loading required package: Biostrings
## Loading required package: XVector
## 
## Attaching package: 'Biostrings'
## The following object is masked from 'package:base':
## 
##     strsplit
## 
## Attaching package: 'VariantAnnotation'
## The following object is masked from 'package:base':
## 
##     tabulate
#hier worden de 4 files in een variabele gezet met de sample code
vcf_file_552 <- "/Users/Gebruiker/Desktop/data_genomics_SRR/annotated_SRR26980552.vcf"
vcf_file_551 <- "/Users/Gebruiker/Desktop/data_genomics_SRR/annotated_SRR26980551.vcf"
vcf_file_550 <- "/Users/Gebruiker/Desktop/data_genomics_SRR/annotated_SRR26980550.vcf"
vcf_file_549 <- "/Users/Gebruiker/Desktop/data_genomics_SRR/annotated_SRR26980549.vcf"

#hier worden de 4 files met readVCF gelezen met het bijbehorende refrence genoom ook wel de GRCm39 muis het nieuwste muisgenoom en deze worden in een nieuwe varaible gezet.
vcf_data_file_552 <- readVcf(vcf_file_552, genome="GRCm39")
vcf_data_file_551 <- readVcf(vcf_file_551, genome="GRCm39")
vcf_data_file_550 <- readVcf(vcf_file_550, genome="GRCm39")
vcf_data_file_549 <- readVcf(vcf_file_549, genome="GRCm39")

head
## standardGeneric for "head" defined from package "utils"
## 
## function (x, ...) 
## standardGeneric("head")
## <environment: 0x000001e742c66098>
## Methods may be defined for arguments: x
## Use  showMethods(head)  for currently available ones.
#Dit zorgt ervoor dat de 4 barplots in 1 plaatje weergegeven worden
par(mfrow=c(2,2))

#Hier kijk ik met de INFO commando naar wat de data file bevat en met de $TYPE alleen naar wat voor type variant dit is. onder is te zien hoe dit er uit ziet. Daarna wordt het in een variabele gezet wat dan weer omgezet wordt in een tabel zodat het in een barplot gezet kan worden.
variant_type <- info(vcf_data_file_552)$TYPE
variant_type_counts552 <- table(variant_type)

#Hier wordt een barplot gemaakt met de varianten types, xlab geeft weer wat er de x as staat, col geeft de barplot zijn kleur (echter werkt het soms niet) en ylab is wat er op de y as staat.
bp_v_552 <- barplot(variant_type_counts552, 
        main = "Telling Variant Types - sample 552",
        xlab = "Variant Soort",
        ylab = "Telling",
        col = "lightblue")

variant_type <- info(vcf_data_file_551)$TYPE
variant_type_counts551 <- table(variant_type)

bp_v_551 <- barplot(variant_type_counts551, 
        main = "Telling Variant Types - sample 551",
        xlab = "Variant Soort",
        ylab = "Telling",
        col = "lightblue")

variant_type <- info(vcf_data_file_550)$TYPE
variant_type_counts550 <- table(variant_type)

bp_v_550 <- barplot(variant_type_counts550, 
        main = "Telling Variant Types - sample 550",
        xlab = "Variant Soort",
        ylab = "Telling",
        col = "lightblue")

variant_type <- info(vcf_data_file_549)$TYPE
variant_type_counts549 <- table(variant_type)

bp_v_549 <- barplot(variant_type_counts549, 
        main = "Telling Variant Types - sample 549",
        xlab = "Variant Soort",
        ylab = "Telling",
        col = "lightblue")

Uit deze komen 4 barplots die naast elkaar worden gezet. De barplots geven per type variant weer hoeveel er zijn. er is in deze barplots te zien dat de meeste type varianten insertie varianten zijn en op 2de plaats 1 nucleotide veranderingen bij elke sample. Het verschil tussen de samples is wel dat sample 550 rond 8000 insertie varianten heeft en sample 549 rond de 5000 heeft. Het is niet te zien uit deze grafieken of deze varianten ook op het exon zitten.

Het is belangrijk om dit te weten omdat sommige varianten meer impact hebben dan anderen. SNP varianten kunnen voor geen enkele veranderingen zorgen downstream, of ook juist wel door bijvoobeeld van een normale codon een stop codon te maken waardoor downstream de aminozuren niet goed worden getranscripteerd. De locatie is belangrijk om te weten omdat dit kan zeggen of het te maken heeft met onze onderzoeksvraag. Om terug te komen over waarom deze grafieken belangrijk zijn is om te laten zien dat er degelijk mutaties in de varianten zijn en dat sommige samples veel hebben.

Wat voor info zit er in info(vcf_data_file_552)$TYPE CharacterList of length 225071 [[1]] snp [[2]] snp [[3]] ins [[4]] snp [[5]] snp [[6]] snp [[7]] del [[8]] ins [[9]] snp [[10]] snp … <225061 more elements>

Hier is een afkorting te lezen, deze afkorting geeft aan wat voor type variant dit is. Hier onder is een tabel te zien met welke afkorting wat doet.

Soort mutatie: Betekenis: Voorbeeld:
SNP Single-Nucleotide Polymorphism Reference = ‘A’, Sample = ‘C’
Ins Insertion Reference = ‘A’, Sample = ‘AGT’
Del Deletion Reference = ‘AC’, Sample = ‘C’
MNP Multiple-nucleotide polymorphism Reference = ‘ATA’, Sample = ‘GTC’
MIXED Multiple-nucleotide and an InDel Reference = ‘ATA’, Sample = ‘GTCAGT’

Deze tabel is gemaakt door floris en kan terug gevonden worden in zijn logboek.

library(ggplot2)

#hier gebruik ik rowranges om de positie van de varianten uit de vcf data te krijgen en dan start() om de start positie er uit te halen.
variable_poisitions <- start(rowRanges(vcf_data_file_552))

#ggplot gebruik ik hier opmerkelijk is de binwidth deze is 1000000 Dit betekent dat elk bin (balkje) een breedte heeft van 1 miljoen (1,000,000) posities
ggplot(data.frame(variable_poisitions), aes(x = variable_poisitions)) +
  geom_histogram(binwidth = 1000000, fill = "skyblue", color = "black") +
  labs(title = "Distriebutie van Variant Positions",
       x = "Position op het chromosoom",
       y = "tellingvan Varianten") +
  theme_minimal()

Hier is een grafiek te zien waar de variant positie wordt weergegeven op het chromosoom. Deze grafiek is echter niet goed, dit is omdat alle chromosomen worden weergegeven en niet iets specifiek waardoor je eigenlijk alle varianten ziet op elk chromosoom door elkaar. Er is wel een piek wat opmerkelijk is.

#hier lees ik de data op een andere manier in met read.delim dit is een tab-delimeneted wat betekent dat het door tabs gescheiden is, ook lees ik hem im vanaf lijn 129 omdat ik de header wil skippen dit is omdat hier geen info staat die ik nodig heb voor visualisatie ook wel een header. stringsafactors false zodat R de strings als characters laat en niet in factors om zet. 
vcf_data_549 <- read.delim("/Users/Gebruiker/Desktop/data_genomics_SRR/annotated_SRR26980549.vcf", skip=129 ,stringsAsFactors = FALSE)
vcf_data_550 <- read.delim("/Users/Gebruiker/Desktop/data_genomics_SRR/annotated_SRR26980550.vcf", skip=129 ,stringsAsFactors = FALSE)
vcf_data_551 <- read.delim("/Users/Gebruiker/Desktop/data_genomics_SRR/annotated_SRR26980551.vcf", skip=129 ,stringsAsFactors = FALSE)
vcf_data_552 <- read.delim("/Users/Gebruiker/Desktop/data_genomics_SRR/annotated_SRR26980552.vcf", skip=129 ,stringsAsFactors = FALSE)
#hier gebruik ik head om de eerste 6 lijnen te bekijken en de $X.chromosoom om te zien of ze allemaal met dezelfde chromosoom beginnen
head(vcf_data_549$X.CHROM)
## [1] "NC_000067.7" "NC_000067.7" "NC_000067.7" "NC_000067.7" "NC_000067.7"
## [6] "NC_000067.7"
head(vcf_data_550$X.CHROM)
## [1] "NC_000067.7" "NC_000067.7" "NC_000067.7" "NC_000067.7" "NC_000067.7"
## [6] "NC_000067.7"
head(vcf_data_551$X.CHROM)
## [1] "NC_000067.7" "NC_000067.7" "NC_000067.7" "NC_000067.7" "NC_000067.7"
## [6] "NC_000067.7"
head(vcf_data_552$X.CHROM)
## [1] "NC_000067.7" "NC_000067.7" "NC_000067.7" "NC_000067.7" "NC_000067.7"
## [6] "NC_000067.7"

Ik voer deze head uit voor alle 4 samples omdat ik wil zien of ze allemaal dezelfde chr bevatten waardoor ik weet of ik die kan gebruiken voor de filter stap in de volgende code.

#Hier gebruik ik grepl niet grep omdat grepl kijkt in de kollomen of NC_000067.7 voorkomt en dan specifiek de vcf_data_549$X.CHROM kolom als deze true is word de hele row die deze bevat meegegeven aan de nieuwe variable.
vcf_data_549_filterd <- vcf_data_549[grepl("NC_000077.7", vcf_data_549$X.CHROM),] 
variable_poisitions_549 <- vcf_data_549_filterd$POS

#hier wordt een plot gemaakt waar ik van variable_poisitions_549 een dataframe maak zodat het werkt met ggplot dan zet ik de x ook naar het data frame en ik wil dat het een geom_histogram is weer met de binwidth deze is 1000000 Dit betekent dat elk bin (balkje) een breedte heeft van 1 miljoen (1,000,000) posities. daarna zet ik de x en y labels met labs en het thema van de grafiek
p_549 <- ggplot(data.frame(variable_poisitions_549), aes(x = variable_poisitions_549)) +
  geom_histogram(binwidth = 1000000, fill = "blue", color = "blue") +
  labs(x = "Positie (coördinaten) op NC_000077.7",
       y = "Aantal varianten")  +
    theme_minimal()

#Hier gebruik ik grepl niet grep omdat grepl kijkt in de kollomen of NC_000067.7 voorkomt en dan specifiek de vcf_data_550$X.CHROM kolom als deze true is word de hele row die deze bevat meegegeven aan de nieuwe variable.
vcf_data_550_filterd <- vcf_data_550[grepl("NC_000077.7", vcf_data_550$X.CHROM),] 
variable_poisitions_550 <- vcf_data_550_filterd$POS

#hier wordt een plot gemaakt waar ik van variable_poisitions_550 een dataframe maak zodat het werkt met ggplot dan zet ik de x ook naar het data frame en ik wil dat het een geom_histogram is weer met de binwidth deze is 1000000 Dit betekent dat elk bin (balkje) een breedte heeft van 1 miljoen (1,000,000) posities. daarna zet ik de x en y labels met labs en het thema van de grafiek
p_550 <- ggplot(data.frame(variable_poisitions_550), aes(x = variable_poisitions_550)) +
  geom_histogram(binwidth = 1000000, fill = "blue", color = "blue") +
  labs(x = "Positie (coördinaten) op NC_000077.7",
       y = "Aantal varianten")  +
    theme_minimal()

#Hier gebruik ik grepl niet grep omdat grepl kijkt in de kollomen of NC_000067.7 voorkomt en dan specifiek de vcf_data_551$X.CHROM kolom als deze true is word de hele row die deze bevat meegegeven aan de nieuwe variable.
vcf_data_551_filterd <- vcf_data_551[grepl("NC_000077.7", vcf_data_551$X.CHROM),] 
variable_poisitions_551 <- vcf_data_551_filterd$POS

#hier wordt een plot gemaakt waar ik van variable_poisitions_551 een dataframe maak zodat het werkt met ggplot dan zet ik de x ook naar het data frame en ik wil dat het een geom_histogram is weer met de binwidth deze is 1000000 Dit betekent dat elk bin (balkje) een breedte heeft van 1 miljoen (1,000,000) posities. daarna zet ik de x en y labels met labs en het thema van de grafiek
p_551 <- ggplot(data.frame(variable_poisitions_551), aes(x = variable_poisitions_551)) +
  geom_histogram(binwidth = 1000000, fill = "blue", color = "blue") +
  labs(x = "Positie (coördinaten) op NC_000077.7",
       y = "Aantal varianten")  +
    theme_minimal()

#Hier gebruik ik grepl niet grep omdat grepl kijkt in de kollomen of NC_000067.7 voorkomt en dan specifiek de vcf_data_552$X.CHROM kolom als deze true is word de hele row die deze bevat meegegeven aan de nieuwe variable.
vcf_data_552_filterd <- vcf_data_552[grepl("NC_000077.7", vcf_data_552$X.CHROM),] 
variable_poisitions_552 <- vcf_data_552_filterd$POS

#hier wordt een plot gemaakt waar ik van variable_poisitions_552 een dataframe maak zodat het werkt met ggplot dan zet ik de x ook naar het data frame en ik wil dat het een geom_histogram is weer met de binwidth deze is 1000000 Dit betekent dat elk bin (balkje) een breedte heeft van 1 miljoen (1,000,000) posities. daarna zet ik de x en y labels met labs en het thema van de grafiek
p_552 <- ggplot(data.frame(variable_poisitions_552), aes(x = variable_poisitions_552)) +
  geom_histogram(binwidth = 1000000, fill = "blue", color = "blue") +
  labs(x = "Positie (coördinaten) op NC_000077.7 ",
       y = "Aantal varianten") +
    theme_minimal()
p_552

Hier is de plot van sample 552 te zien, er is te zien dat aan het begin er een grote piek is wat betekent dat er net minder dan 400 varianten op deze locatie zich bevinden. Uit deze plot is niet te halen wat voor type varianten het zijn of wat voor schade / geen schade ze aanbrengen. Deze plot zegt wel dat het begin van de Ebf1 proteine sequentie in de 552 sample veel varianten zitten dus interessant kan zijn voor diepere analyse . NC_000077.7 is de locatie van de Ebf1 proteine deze gaat van 44502738 - 44898923 aldus https://www.ncbi.nlm.nih.gov/gene/13591.

ggplot2 is een library in R die gebruikt kan worden om uitgebreidere plots te maken dan dat base R dat kan. Dit houd in dat alles aan te passen is, van kleuren tot labels tot titels en nog veel meer andere stijl aanpassingen.

#hier wordt ggarrange gebruikt om de verschillende plots samen in 1 frame te zetten waardoor het makkelijker te vergelijken is in 1 opzicht. labels en de rows zorgen voor verduidelijking van wat de samples zijn en hoe de plots geordend zijn
multi_pos_plot <- ggarrange(p_549, p_550, p_551, p_552,
          labels = c("Sample: 549", "Sample: 550", "Sample: 551", "Sample: 552"),
          ncol = 2, nrow = 2)

#hier wordt de plot titel weergegeven 1 algemene titel inplaats van 4 dezelfde
annotate_figure(multi_pos_plot, top = text_grob("Distributie van Variant posities Ebf1 ", 
               color = "black", size = 14))

Hier zijn 4 plots te zien waar de positie van varianten zijn te zien in het Ebf1 gen (NC_000070.7).
Er is te zien dat er grote interessante pieken zijn waar dieper in moet worden gekeken wat voor varianten het zijn en of het op een exon zit of niet.

head(vcf_data_549)
#Hier gebruik ik grepl niet grep omdat grepl kijkt in de kollomen of NC_000067.7 voorkomt en dan specifiek de vcf_data_549$X.CHROM kolom als deze true is word de hele row die deze bevat meegegeven aan de nieuwe variable.
vcf_data_549_pax5 <- vcf_data_549[grepl("NC_000070.7", vcf_data_549$X.CHROM),] 
variable_poisitions_549 <- vcf_data_549_pax5$POS

#hier wordt een plot gemaakt waar ik van variable_poisitions_549 een dataframe maak zodat het werkt met ggplot dan zet ik de x ook naar het data frame en ik wil dat het een geom_histogram is weer met de binwidth deze is 1000000 Dit betekent dat elk bin (balkje) een breedte heeft van 1 miljoen (1,000,000) posities. daarna zet ik de x en y labels met labs en het thema van de grafiek
p_549 <- ggplot(data.frame(variable_poisitions_549), aes(x = variable_poisitions_549)) +
  geom_histogram(binwidth = 1000000, fill = "black", color = "black") +
  labs(x = "Positie (coördinaten) op NC_000070.7",
       y = "Aantal varianten")  +
    theme_minimal()

#Hier gebruik ik grepl niet grep omdat grepl kijkt in de kollomen of NC_000067.7 voorkomt en dan specifiek de vcf_data_550$X.CHROM kolom als deze true is word de hele row die deze bevat meegegeven aan de nieuwe variable.
vcf_data_550_pax5 <- vcf_data_550[grepl("NC_000070.7", vcf_data_550$X.CHROM),] 
variable_poisitions_550 <- vcf_data_550_pax5$POS

#hier wordt een plot gemaakt waar ik van variable_poisitions_550 een dataframe maak zodat het werkt met ggplot dan zet ik de x ook naar het data frame en ik wil dat het een geom_histogram is weer met de binwidth deze is 1000000 Dit betekent dat elk bin (balkje) een breedte heeft van 1 miljoen (1,000,000) posities. daarna zet ik de x en y labels met labs en het thema van de grafiek
p_550 <- ggplot(data.frame(variable_poisitions_550), aes(x = variable_poisitions_550)) +
  geom_histogram(binwidth = 1000000, fill = "black", color = "black") +
  labs(x = "Positie (coördinaten) op NC_000070.7",
       y = "Aantal varianten")  +
    theme_minimal()

#Hier gebruik ik grepl niet grep omdat grepl kijkt in de kollomen of NC_000067.7 voorkomt en dan specifiek de vcf_data_551$X.CHROM kolom als deze true is word de hele row die deze bevat meegegeven aan de nieuwe variable.
vcf_data_551_pax5 <- vcf_data_551[grepl("NC_000077.7", vcf_data_551$X.CHROM),] 
variable_poisitions_551 <- vcf_data_551_pax5$POS

#hier wordt een plot gemaakt waar ik van variable_poisitions_551 een dataframe maak zodat het werkt met ggplot dan zet ik de x ook naar het data frame en ik wil dat het een geom_histogram is weer met de binwidth deze is 1000000 Dit betekent dat elk bin (balkje) een breedte heeft van 1 miljoen (1,000,000) posities. daarna zet ik de x en y labels met labs en het thema van de grafiek
p_551 <- ggplot(data.frame(variable_poisitions_551), aes(x = variable_poisitions_551)) +
  geom_histogram(binwidth = 1000000, fill = "black", color = "black") +
  labs(x = "Positie (coördinaten) op NC_000070.7",
       y = "Aantal varianten")  +
    theme_minimal()

#Hier gebruik ik grepl niet grep omdat grepl kijkt in de kollomen of NC_000067.7 voorkomt en dan specifiek de vcf_data_552$X.CHROM kolom als deze true is word de hele row die deze bevat meegegeven aan de nieuwe variable.
vcf_data_552_pax5 <- vcf_data_552[grepl("NC_000070.7", vcf_data_552$X.CHROM),] 
variable_poisitions_552 <- vcf_data_552_pax5$POS

#hier wordt een plot gemaakt waar ik van variable_poisitions_552 een dataframe maak zodat het werkt met ggplot dan zet ik de x ook naar het data frame en ik wil dat het een geom_histogram is weer met de binwidth deze is 1000000 Dit betekent dat elk bin (balkje) een breedte heeft van 1 miljoen (1,000,000) posities. daarna zet ik de x en y labels met labs en het thema van de grafiek
p_552 <- ggplot(data.frame(variable_poisitions_552), aes(x = variable_poisitions_552)) +
  geom_histogram(binwidth = 1000000, fill = "black", color = "black") +
  labs(x = "Positie (coördinaten) op NC_000070.7",
       y = "Aantal varianten") +
    theme_minimal()
p_552

In figuur 12 is een histogram te zien waar de distrubutie van varianten over chromosoom “NC_000070.7” wordt weergegeven. Dit sample heeft opmerkelijk 3 pieken aan het begin en 2 aan het einde. dit kan wijzen op een hotspot voor mutaties. Nu kijken of het bij de andere samples hetzelfde is.

#hier wordt ggarrange gebruikt om de verschillende plots samen in 1 frame te zetten waardoor het makkelijker te vergelijken is in 1 opzicht. labels en de rows zorgen voor verduidelijking van wat de samples zijn en hoe de plots geordend zijn
multi_pos_plot <- ggarrange(p_549, p_550, p_551, p_552,
          labels = c("Sample: 549", "Sample: 550", "Sample: 551", "Sample: 552"),
          ncol = 2, nrow = 2)

#hier wordt de plot titel weergegeven 1 algemene titel inplaats van 4 dezelfde
annotate_figure(multi_pos_plot, top = text_grob("Distributie van Variant posities pax5", 
               color = "black", size = 14))

In figuur 13 zijn de 4 plots van varianten op de NC_000070.7 ook wel de Pax5. Er is te zien dat er 3 pieken zijn. Aan het begin en 2 aan het einde van de samples. Wat wel opmerkelijk is dat in sample 552 bij verre de hoogste peak heeft deze tikt bijna 1000 varianten aan op 1 positie. Wat het dus een interessante hotspot maakt en zegt dat er rond deze positie een diepere analyse moet gebeuren.

Week 5 - Chromosoom namen wijzigen

De chromosoomnamen waren in de .vcf bestanden met de GeneBank namen aangeduid terwijl SnpEff RefSeq namen verwacht. Deze moeten dus veranderd worden zodat SnpEff kan werken voor de analyse van wat de varianten inhouden.

Het omzetten van vcf naar een vcf.gz doormiddel van bgzip

#bgzip is een compressie programma wat vcf en andere genoische bestanden coprimeren het zorgt dat het compatible is met ons volgende programma tabix, -c zegt dat de output naar de standaard uitvoer moet sturen,in plaats van het bestand in te schrijven. Hierdoor kunnen we de output omleiden naar een nieuw bestand.
bgzip -c /students/2024-2025/Thema05/3dconformatieChromatine/annotated_variants.vcf > /students/2024-2025/Thema05/3dconformatieChromatine/annotated_variants.vcf.gz

De reden om de vcf te comprimeren is de pipeline die wij gebruiken voor Anotatie, tabix het volgende programma vraag om een input van een gecomprimeerd bestand dit is omdat het efficiënter kan zoeken en verwerken in dit format.

Indexering met tabix

#tabixwordt gebruikt om indexen te maken voor gecomprimeerde bestanden, zoals VCF-bestanden.dit zorgt dat het mogelijk is om snel gegevens uit het bestand te extraheren op basis van chromosoom en positie, zonder dat het hele bestand gedecodeerd hoeft te worden. -p vcf geeft het type bestand aan dat je aan het indexeren bent. In dit geval is het een VCF-bestand. Dit helpt tabix om de juiste indeling en structuur voor indexering toe te passen
tabix -p vcf /students/2024-2025/Thema05/3dconformatieChromatine/annotated_variants.vcf.gz

Tabix maakt een index van het gecomprimeerde VCF-bestand. Deze index is essentieel om snel specifieke bestanden in het bestand op te kunnen zoekn op basis van chromosoom en positie. Zonder deze index is het moeilijker om door het bestand te zoeken wat dus inefficiënt werken is ook is het lastiger en duurt het langer om dingen op te halen uit het bestand.

Hernaam chromosomen

Eerst names.txt aanmaken

#zcat opend de zipped file .gz en leest de output
zcat /students/2024-2025/Thema05/3dconformatieChromatine/annotated_variants.vcf.gz | grep -v '^#' | cut -f1 | sort | uniq > old_chr_names.txt
# grep -v filterd op lines die met # beginnen, cut -f1 extract de eerste colom van de overgebleven data, sort sorteed de chromosoom namen, uniq verwijderd dubbelen zodat alleen unieke overlblijven

awk '{print $1, "x"}' old_chr_names.txt > names.txt
# awk proceeerd elke line in old_chr_names.txt, print $1 print de chr naam en de X print een x

cat names.txt

in deze names.text hebben we handmatig de goede chr positie uitgezocht voor de bijbehorende oudenamen waardoor de volgende structuur is ontstaan

CM000994.3 Chr 1
CM000995.3 Chr 2
CM000996.3 Chr 3
CM000997.3 Chr 4

Dit is gedaan doormiddel van https://www.ncbi.nlm.nih.gov/datasets/genome/GCF_000001635.27/

# bcftools annotate is een subcommando van bcftools dat vcf bestanden manipuleert, de --rename-chrs betekent dat ik de chromosomen wil hernomen.
bcftools annotate --rename-chrs /homes/jjduiker/Desktop/Genomics_transcriptomics_analysis/analysis/Jarno/names.txt /students/2024-2025/Thema05/3dconformatieChromatine/annotated_variants.vcf.gz > /students/2024-2025/Thema05/3dconformatieChromatine/hernoemd_variant_calling.vcf

Hier wordt het bestand names.txt gebruikt om de oude chromosoomnamen in het VCF-bestand te hernoemen naar de nieuwe namen. Dit is nodig omdat SnpEff RefSeq namen verwacht.

#hier wordt een java programma uitgevoerd -Xmx8g zegt dat er max 8gb mag worden gebruikt, daarna wordt het bestand aangeroepen -v betekent verbose wat zegt dat de uitvoer gedetailleerd is.-stats zegt dat er op het volgende aangegeven path een html bestand moet aangemaakt worden. GRCh38.p14 is het ref genoom. daarna het pad naar het vcf file wat er moet worden hernoemd en dan de > waarna het pad komt waar het nieuwe bestand word opgeslagen
java -Xmx8g -jar /students/2024-2025/Thema05/3dconformatieChromatine/snpEff/snpEff/snpEff.jar -v -stats /students/2024-2025/Thema05/3dconformatieChromatine/variant_calling/{}_annotatie.html mm39 /students/2024-2025/Thema05/3dconformatieChromatine/variant_calling/hernoemd_{}.vcf -threads 50 > /students/2024-2025/Thema05/3dconformatieChromatine/variant_calling/annotated_{}.vcf'

SnpEff is een tool voor het annoteren van varianten. SnpEff voegt analyses toe zoals welke genen worden beïnvloed door de mutaties of welke functionele gevolgen de varianten hebben. Hier wordt ook een HTML-rapport gegenereerd dat statistieken geeft over het annotatieproces. Er worden hier 50 threads gebruikt dit om de stress van het proces te verdelen.

Resultaten / Visualisatie logboek teamgenoten

Figuur 14: Resulaten SnpEff
Figuur 14: Resulaten SnpEff

Dit zijn de resultaten uit het logboek van Floris. Uit deze tabellen is te halen dat het grootste deel van de varianten in sample SRR26980549 zijn inserties of een snp (Single-Nucleotide Polymorphism). Deze varianten zijn grotendeel missense of silent. Dit betekent dat wanneer deze mutaties op een exon zitten het problemen kan geven in de expressie van het gen.

Voor verdere analyse kijk naar het logboek van floris.

Relfectie - discussie resultaten

Ik heb bevonden dat er niet vroeg genoeg is begonnen met de analyse van de visualisatie, dit is omdat ik nog niet de positie heb kunnen vinden van de spikes uit de grafieken in figuur 6. Daarnaast voor de onderzoeks vraag er zijn wel varianten aanwezig maar ik heb niet kunnen achterhalen of deze nou goed of slechte varianten zijn. Dus ik denk dat het belangrijk is om sneller bezig te gaan met de visualisatie en de visualisatie te analyseren en daarmee weer een nieuwe visualisatie doen voor de interesante dingen die daar uitkomen.

Referenties

Babraham Bioinformatics. n.d. FastQC: A Quality Control tool for High Throughput Sequence Data.” https://www.bioinformatics.babraham.ac.uk/projects/fastqc/.
FastQC.” n.d. https://mugenomicscore.missouri.edu/PDF/FastQC_Manual.pdf.
“FreeBayes DNAseq Workflow.” n.d. https://bioinformaticsworkbook.org/dataAnalysis/VariantCalling/freebayes-dnaseq-workflow.html#gsc.tab=0.
Harris, H. L., H. Gu, M. Olshansky, et al. 2023. “Chromatin Alternates Between a and b Compartments at Kilobase Scale for Subgenic Organization.” Nature Communications 14: 3303. https://doi.org/10.1038/s41467-023-38429-1.
Khetani, M. P. R. 2018. “Quality Control: Assessing FASTQC Results.” https://hbctraining.github.io/Intro-to-rnaseq-hpc-salmon/lessons/qc_fastqc_assessment.html.
Ma, Fan, Yifei Cao, Hui Du, et al. 2024. Three-dimensional chromatin reorganization regulates B cell development during ageing.” Nature Cell Biology 26: 991–1002. https://doi.org/10.1038/s41556-024-01424-9.
Musich, R., L. Cadle-Davidson, and M. V. Osier. 2021. “Comparison of Short-Read Sequence Aligners Indicates Strengths and Weaknesses for Biologists to Consider.” Frontiers in Plant Science 12: 657240. https://doi.org/10.3389/fpls.2021.657240.
Nemazee, D. 2017. “Mechanisms of Central Tolerance for b Cells.” Nature Reviews Immunology 17: 281–94. https://doi.org/10.1038/nri.2017.19.
Oji, Asami, Linda Choubani, Hisashi Miura, and Ichiro Hiratani. 2024. “Structure and Dynamics of Nuclear a/b Compartments and Subcompartments.” Current Opinion in Cell Biology 90: 102406. https://doi.org/10.1016/j.ceb.2024.102406.
Samtools-Markdup(1) Manual Page. n.d. http://www.htslib.org/doc/samtools-markdup.html.
Takasugi, Mitsuo, Yuki Yoshida, Yoshinori Nonaka, and Nobuyuki Ohtani. 2023. Gene expressions associated with longer lifespan and aging exhibit similarity in mammals.” Nucleic Acids Research 51 (14): 7205–19. https://doi.org/10.1093/nar/gkad544.
Zhang, Xiaoming, Shiheng Lv, Zhen Luo, Yijie Hu, Xun Peng, Jianbo Lv, Shanshan Zhao, et al. 2021. MiniCAFE, a CRISPR/Cas9-based compact and potent transcriptional activator, elicits gene expression in vivo.” Nucleic Acids Research 49 (7): 4171–85. https://doi.org/10.1093/nar/gkab174.
LS0tDQp0aXRsZTogIkxvZ2JvZWstR2Vub21pY3MiDQphdXRob3I6ICJKYXJubyBKYWNvYiBEdWlrZXIiDQpiaWJsaW9ncmFwaHk6IExvZ2JvZWtfR2Vub21pY3NfSmFybm8uYmliDQpvdXRwdXQ6DQogIGh0bWxfZG9jdW1lbnQ6DQogICAgY29kZV9mb2xkaW5nOiBoaWRlDQogICAgY29kZV9kb3dubG9hZDogdHJ1ZQ0KICAgIHRvYzogdHJ1ZQ0KICAgIHRvY19mbG9hdDogdHJ1ZQ0KICAgIGRmX3ByaW50OiBwYWdlZA0KLS0tDQoNCmBgYHtyIHNldHVwLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBpbmNsdWRlPUZBTFNFfQ0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KG91dC53aWR0aCA9ICcxMDAlJywgZHBpPTUwMCkgIyBjb25maWd1cmF0aWUgdm9vciBmaWd1dXIgZ3Jvb3R0ZSBlbiByZXNvbHV0aWUNCmxpYnJhcnkoZHBseXIpDQpsaWJyYXJ5KGdncGxvdDIpDQpsaWJyYXJ5KGdncHVicikNCg0KYGBgDQoNCiMjIEludHJvZHVjdGllOg0KDQpEaXQgbG9nYm9layBnYWF0IG92ZXIgR2Vub21pY3MgZW4gVHJhbnNjcmlwdG9taWNzLCBEZSBlZXJzdGUgNSB3ZWtlbiBmb2N1c3NlbiB3ZSBvcCBoZXQgR2Vub21pY3MgZ2VkZWVsdGUuIEluIGRlIEdlbm9taWNzIGthbnQgdmFuIGRpdCBvbmRlcnpvZWsgZ2FhbiB3ZSBraWprZW4gbmFhciBoZXQgdm9sZ2VuZGU6ICoqWmlqbiBlciB2YXJpYW50ZW4gYWFud2V6aWcgdmFuIFBBWDUgZW4gRWJmMSBpbiBoZXQgZ2Vub29tIHZhbiBkZSByYWcyIGtub2Nrb3V0IG11aXplbiBkaWUgZ2VicnVpa3Qgemlqbj8qKiBEZSByZWRlbiBkYXQgZ2Vrb3plbiBpcyB2b29yIFBBWDUgZW4gRWJmMSBpcyBvbWRhdCBkZXplIGJldHJva2tlbiB6aWpuIGJpaiBkZSBvbnR3aWtrZWxpbmcgdmFuIHZvb3Jsb3BlciBCIGNlbGxlbi4gV2FubmVlciBlciB2YXJpYXRpZSB6aXQgaW4gb256ZSBETkEtc2VxIGthbiBkYXQgZXJvcCB3aWp6ZW4gZGF0IGRlIEViZjEgZW4gUEFYNSBuaWV0IGdvZWQga3VubmVuIG9udHdpa2tlbGVuIHdhdCBlciB2b29yIHpvcmd0IGRhdCBkZSB2b29ybG9wZXIgQiBjZWxsZW4gbm9vaXQgZ29lZCBuYWFyIEIgY2VsbGVuIGt1bm5lbiB0cmFuc2Zvcm1lcmVuLiBEaXQga2FuIGR1cyB6b3JnZW4gdm9vciBmb3V0ZW4gaW4gZGUgb250d2lra2VsaW5nIHZhbiBkZSBtdWlzLg0KDQpJbiBoZXQgdHJhbnNjcmlwdG9taWNzIGdlZGVlbHRlIHdvcmR0IGhpZXIgb29rIGdlYnJ1aWsgdmFuIGdlbWFha3QgZHVzIGlzIGhldCBnb2VkIG9tIHRlIHdldGVuIG9mIGVyIHZhcmlhbnRlbiBhYW53ZXppZyB6aWpuIGluIGhldCBnZW5vb20gdmFuIGRlIG11aXplbiBkaWUgdm9vciB0cmFuc2NyaXB0b21pY3MgZ2VicnVpa3Qgd29yZGVuIChSYWcyIGtub2Nrb3V0KS4NCg0KIyMjIyBPbmRlcnpvZWtzdnJhYWcNCg0KKipaaWpuIGVyIHZhcmlhbnRlbiBhYW53ZXppZyB2YW4gUEFYNSBlbiBFYmYxIGluIGhldCBnZW5vb20gdmFuIGRlIHJhZzIoLS8tKSBtdWl6ZW4gZGllIGdlYnJ1aWt0IHppam4/KioNCg0KIyMjIFdvcmtmbG93DQoNCkROQSB3YXMgd2VsIGVlbiBkZWVsIHZhbiBvbnplIGRhdGFzZXQgZWNodGVyIGlzIGVyIGluIGhldCByZWZlcmVudGllIG9uZGVyem9layAoIEBNYTIwMjQgKSBuaWV0IHdhdCBlciBtZWUgZ2VkYWFuIGlzLiBEaXQgaXMgZGUgcmVkZW4gZGF0IHdlIGhlYmJlbiBiZXNsb3RlbiBvbSBlZW4gdmFyaWFudCBhbmFseXNlIHRlIGRvZW4gb3AgZGUgZGF0YS4gSGllciBnYWFuIHdlIGhldCByZWZlcmVudGllZ2Vub29tIHZhbiBkZSBtdWlzIHZlcmdlbGlqa2VuIG1ldCBETkEgc2VxIGRhdGEuIEluIGhldCBvbmRlcnpvZWsgaXMgaGV0IG1tMTAgZ2Vub29tIGdlYnJ1aWt0LCBkaXQgZ2Vub29tIGtvbXQgdWl0IDIwMTIgd2F0IGR1cyByZWRlbGlqayBvdWQgaXMgZW4gb20gZGV6ZSByZWRlbiB2ZXJ2YW5nZW4gd2lqIGRpdCBvdWRlIGdlbm9vbSBtZXQgaGV0IG5pZXV3ZSBtdWlzIGdlbm9vbSBkZSBHUkNtMzkgZGV6ZSBrb210IHVpdCAyMDIwLiBEZSBlZXJzdGUgc3RhcCBpcyBvbSBkZSAuU1JBIGZpbGVzIHRlIGRvd25sb2FkZW4gdmFuIGRlIGFyY2hpZXZlbiwgZGV6ZSBiZXZhdHRlbiBmYXN0cSBiZXN0YW1kZW4sIHByZWZldGNoIHdvcmR0IGdlYnJ1aWt0IGhpZXJ2b29yLiBEYW4gd29yZGVuIGRlIC5TUkEgZmlsZXMgdWl0Z2VwYWt0IGRvb3IgaGV0IGdlYnJ1aWtlbiB2YW4gZmFzdGVycS1kdW1wLiBEZXplIGZhc3RxIGZpbGVzIHdvcmRlbiBkb29yIEZhc3RRQyBnZWhhYWxkIG9tIGRlIGt3YWxpdGVpdCB0ZSBjaGVja2VuLiBEZSBmaWxlcyB3b3JkZW4gZ2VhbmFseXNlZXJkIG9wIGt3YWxpdGVpdCBlbiB3b3JkZW4gaGllcm5hIGdldHJpbW1lZCB6byBub2RpZy4gRHVwbGljYXRlbiBlbiBhZGFwdGVycyB3b3JkZW4gdWl0IGRlIEROQS1zZXEgZ2VoYWFsZCBlbiBkZSBkYXRhIHdvcmR0IGdlYWxpw6tuZWVyZC4gRGFhcm5hIHdvcmR0IGZyZWViYXllcyBnZWJydWlrdCBvbSBkZSBETkEtc2VxIHRlIHZlcmdlbGlqa2VuIG1ldCBoZXQgcmVmZXJlbnRpZSBnZW5vb20gd2F0IGR1cyBkZSB2YXJpYW50IGFuYWx5c2UgaXMuIFVpdCBkZXplIHZhcmlhbnQgYW5hbHlzZSByZXN1bHRhdGVuIHdvcmR0IGVlbiB2aXN1YWxpc2F0aWUgZ2VtYWFrdCBlbiBlZW4gY29uY2x1c2llIG9mIGVyIHdhdCBnZXZvbmRlbiBpcy4NCg0KIyMjIEhldCBvbmRlcnpvZWsNCg0KRGl0IG9uZGVyem9layBmb2N1c3Qgb3AgdmFyaWFudCBhbmFseXNlLCBoaWVyb20gaXMgZGUgKipvbmRlcnpvZWtzdnJhYWcqKiBvb2s6ICoqWmlqbiBlciB2YXJpYW50ZW4gYWFud2V6aWcgdmFuIFBBWDUgZW4gRWJmMSBpbiBoZXQgZ2Vub29tIHZhbiBkZSByYWcyKC0vLSkgbXVpemVuIGRpZSBnZWJydWlrdCB6aWpuPyoqDQoNCkRlemUgb25kZXJ6b2Vrc3ZyYWFnIGlzIHJlbGV2YW50IG9tZGF0IGVyIGluIGhldCB0cmFuc2NyaXB0b21pY3MgdmFuIGhldCBvcmlnaW5lbGUgb25kZXJ6b2VrIEBNYTIwMjQgZ2VrZWtlbiB3b3J0IG5hYXIgdmVyc2NoaWxsZW4gaW4gZXhwcmVzc2llIHZhbiBkZSBnZW5vZW1kZSBnZW5lbi4gQWxzIGVyIHZhcmlhbnRlbiBhYW53ZXppZyBibGlqa2VuIHRlIHppam4gaW4gZGV6ZSBnZW5lbiBrYW4gaGV0IHZlcnNjaGlsIGluIGRlIGV4cHJlc3NpZSB0dXNzZW4gZGUgbXVpemVuIGRpZSBnZWJydWlrdCB6aWpuIGluIGhldCBvbmRlcnpvZWsgbmlldCBhbGxlZW4gYWFuIGRlIGdldGVzdGUgZmFjdG9yZW4gdG9lZ2V3ZXplbiB3b3JkZW4uIERlIGludmxvZWQgdmFuIHZlcm91ZGVyaW5nIG9wIGV4cHJlc3NpZSBpcyBkYW4gbmlldCB6ZWtlciB3YW50IGRlIG11dGF0aWVzIGt1bm5lbiBvb2sgdm9vciBhbmRlcmUgd2Vya2luZyB6b3JnZW4gdmFuIGRlIGdlbmVuLg0KDQpFciBpcyBhbGxlZW4gRE5BIHNlcXVlbnRpZSBkYXRhIGJlc2NoaWtiYWFyIHZhbiBkZSByYWcoLS8tKSBtdWl6ZW4uIE9tIGRlemUgcmVkZW4ga2FuIGVyIG5pZXQgZ2VrZWtlbiB3b3JkZW4gbmFhciBtdXRhdGllcyBpbiBoZXQgcmFnMiBnZW4sIERlemUgaXMgZHVzIG5pZXQgbWVlciBhYW53ZXppZy4NCg0KSGV0IEViZjEtZ2VuLCBvb2sgYmVrZW5kIGFscyBFYXJseSBCLWNlbGwgZmFjdG9yIDEsIHNwZWVsdCBlZW4gY3J1Y2lhbGUgcm9sIGluIGRlIGRpZmZlcmVudGlhdGllIHZhbiB2b29ybG9wZXJjZWxsZW4gdmFuIEItbHltZm9jeXRlbi4gRWVuIHZlcm1pbmRlcmRlIGV4cHJlc3NpZSB2YW4gaGV0IEViZjEtZ2VuIGthbiByZXN1bHRlcmVuIGluIGZ1bmN0aWV2ZXJsaWVzIHZhbiBCLWNlbGxlbi4gSW4gc2FtZW53ZXJraW5nIG1ldCBQQVg1IHppam4gZGV6ZSBnZW5lbiBiZXRyb2trZW4gYmlqIGRlIHJpanBpbmcgdmFuIGhlbWF0b3BvZXRpc2NoZSBzdGFtY2VsbGVuLiBFZW4gdmVybGllcyB2YW4gZnVuY3RpZSB2YW4gUEFYNSBsZWlkdCB0b3QgZGUgb3Bob3BpbmcgdmFuIHNuZWwgZGVsZW5kZSBseW1mb2JsYXN0ZW4gZGllIG5pZXQgaW4gc3RhYXQgemlqbiB0b3Qgbm9ybWFsZSBkaWZmZXJlbnRpYXRpZS4NCg0KKipSZWxldmFudGllIHZvb3Igb25zIG9uZGVyem9layoqLCBEZSBvbmRlcnpvZWtlcnMgdmFuIGhldCBhcnRpa2VsIGhlYmJlbiwgaW4gdGVnZW5zdGVsbGluZyB0b3QgZGUgYW5hbHlzZXMgZGllIGhldCB0cmFuc2NyaXB0b21pY3NnZWRlZWx0ZSB2YW4gZGUgYW5hbHlzZSBiZXJ0ZWZmZW4sIGdlZW4gZ2VicnVpa2dlbWFha3QgdmFuIGRlemUgRE5BIGRhdGEgZW4gYW5kZXJlIGdlZ2V2ZW5zLCB3YWFyZG9vciBlciBnZWVuIHZlcmdlbGlqa2JhcmUgZ2VnZXZlbnMgemlqbi4gSG9ld2VsIHplIGVlbiB2ZXJvdWRlcmQgbXVpcyByZWZlcmVudGllZ2Vub29tIChtbTEwKSBoZWJiZW4gdG9lZ2VwYXN0LCB2ZXJ2YW5nZW4gd2UgZGl0IGRvb3IgbW0zOS4NCg0KSGllcm9uZGVyIGlzIGVlbiBvdmVyemljaHQgdGUgemllbiB2YW4gZGUgVG9vbHMgZGllIHdpaiBnYWFuIGdlYnJ1aWtlbiBpbiBvbnMgb25kZXJ6b2VrLg0KDQorLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rDQp8IFRvb2wgICAgICAgICAgfCBSZWZlcmVudGllICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFZlcnNpZSAgICAgICAgICAgICAgIHwgV2Fhcm9tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorPT09PT09PT09PT09PT09Kz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0rPT09PT09PT09PT09PT09PT09PT09PSs9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0rDQp8IEZlYXR1cmVjb3VudHMgfCA8aHR0cHM6Ly9hY2FkZW1pYy5vdXAuY29tL2Jpb2luZm9ybWF0aWNzL2FydGljbGUvMzAvNy85MjMvMjMyODg5P3NlYXJjaHJlc3VsdD0xPiB8ICAgICAgICAgICAgICAgICAgICAgIHwgRmVhdHVyZWNvdW50cyBpcyBlZW4gemVlciBlZmZpY2nDq250IGFsZ2VtZWVuICJyZWFkIiBzYW1lbnZhdHRpbmdzcHJvZ3JhbW1hIGRhdCBtYXBwZWQgcmVhZHMgdGVsdCB2b29yIGdlbm9taXNjaGUga2VubWVya2VuIHpvYWxzIGdlbmVuLCBleG9uZW4sIHByb21vdG9yLCBnZW5saWNoYW1lbiwgZ2Vub21pc2NoZSBiaW5zIGVuIGNocm9tb3NvbWFsZSBsb2NhdGllcy4gaGV0IGthbiB3b3JkZW4gZ2VicnVpa3Qgb20gem93ZWwgUk5BLXNlcSBhbHMgZ2Vub21pc2NoZSBETkEtc2VxIGxlZXNiZXdlcmtpbmdlbiB0ZSB0ZWxsZW4gfA0KKy0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKw0KfCBGYXN0UUMgICAgICAgIHwgPGh0dHBzOi8vd3d3LmJpb2luZm9ybWF0aWNzLmJhYnJhaGFtLmFjLnVrL3Byb2plY3RzL2Zhc3RxYy8+ICAgICAgICAgICAgICAgICAgICAgfCAwLjExLjkgICAgICAgICAgICAgICB8IEZhc3RRQyB3b3JkdCBnZWJydWlrdCBvbSBkZSBrd2FsaXRlaXQgdGUgY2hlY2tlbiB2YW4gZGUgcmF1d2UgZGF0YSwgaGllciB1aXQgaXMgdGUgemllbiBvZiBkZSBkYXRhIGdlbGlqayB0ZSBnZWJydWlrZW4gaXMgb2YgZGF0IGRlemUgbW9ldCB3b3JkZW4gZ2V0cmltbWVkLiBEZSB0cmltbWVyIGthbiBvb2sgYWZnZXN0ZWxkIHdvcmRlbiBvcCBiYXNpcyB2YW4gZGUgZmFzdHFjLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKy0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKw0KfCBmcmVlYmF5ZXMgICAgIHwgPGh0dHBzOi8vZ2l0aHViLmNvbS9mcmVlYmF5ZXMvZnJlZWJheWVzPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxLjMuNiAtIGxpbnV4IHZlcnNpZSB8IGZyZWViYXllcyBpcyBlZW4gaGFwbG90eXBlIGdlYmFzZWVyZGUgZ2VuIHZhcmlhbnQgZGV0ZWN0b3IsIG9udHdvcnBlbiBvbSBrbGVpbmUgcG9seW1vcmZpc21lcyB0ZSBkZXRlY3RlcmVuLCBTTlAncywgaW5zZXJ0aWVzIGVuIGRlbGV0aWVzIGluIGhldCBiaWp6b25kZXIuIERpdCBwcm9ncmFtbWEgZ2VicnVpa3QgLkJBTSBiZXN0YW5kZW4gbWV0IGVlbiBQaHJlZCszMyBlbmNvZGluZy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKy0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKw0KfCBzZXF0ayAgICAgICAgIHwgPGh0dHBzOi8vZ2l0aHViLmNvbS9saDMvc2VxdGs+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICB8IHNlcXRrIHdvcmR0IGdlYnJ1aWt0IHZvb3IgaGV0IHByb2Nlc2VyZW4gdmFuIHNlcXVlbmNlcyBpbiBoZXQgRkFTVEEgb2YgRkFTVFEgZm9ybWFhdC4gaGV0ICJzZWFtbGVzc2x5IHBhcnNlcyIgYmVpZGUgRkFTVEEgZW4gRkFTVFEgd2Vsa2UgZGFuIG9vayBvcHRpbWFhbCBjb21wcmVzc2VkIHdvcmR0IGRvb3IgZ3ppcCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKy0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKw0KfCBUcmltbW9tYXRpYyAgIHwgPGh0dHBzOi8vZ2l0aHViLmNvbS91c2FkZWxsYWIvVHJpbW1vbWF0aWM+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAwLjM5ICAgICAgICAgICAgICAgICB8IFRyaW1tb21hdGljIHdvcmR0IGdlYnJ1aWt0IG9tIGRlIGRhdGEgb3AgdGUgc2Nob25lbiBuYWRhdCBkZXogdWl0IEZhc3RRQyBrb210LiBEZXplIGhhYWx0IGRlIHNsZWNodGUga3dhbGl0ZWl0IHBhcmVuIGFmIHZhbiBkZSBzdHJlbmcgd2FhcmRvb3IgZWVuIGhvZ2Uga3dhbGl0ZWl0IFJOQS0gb2YgRE5BLXN0cmVuZyBvdmVyYmxpamZ0IGRpZSBnZWJydWlrdCBrYW4gd29yZGVuLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKy0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKw0KfCBid2EgbWVtMiAgICAgIHwgPGh0dHBzOi8vZ2l0aHViLmNvbS9id2EtbWVtMi9id2EtbWVtMj90YWI9cmVhZG1lLW92LWZpbGU+ICAgICAgICAgICAgICAgICAgICAgICAgfCAyLjIuMSAgICAgICAgICAgICAgICB8IEJ3YSBtZW0yIHdvcmR0IGdlYnJ1aWt0IG9tIEROQSBlbiBSTkEgcmVhZHMgdGUgYWxpZ25lbiB0ZWdlbiBlZW4gZ2Vrb3plbiByZWZlcmVudGllIGdlbm9vbS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKy0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKw0KfCBTYW10b29scyAgICAgIHwgPGh0dHBzOi8vd3d3Lmh0c2xpYi5vcmc+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxLjE2LjEgICAgICAgICAgICAgICB8IHNhbXRvb2xzIGlzIGVlbiBzZXQgdmFuICJ1dGlsaXRpZXMiIGRhdCBhbGlnbm1lbnRzIGluIGRlIFNBTSwgQmFtIGVuIENSQU0gZm9ybWF0dGVuIGthbiBtYW5pcHVsZXJlbi4gaGV0IGthbiB2ZXJhbmRlcmVuIHR1c3NlbiBkZSBmb3JtYXRzLCBzb3J0ZXJlbiwgc2FtZW52b2VnZW4gZW4gaW5kZXhlbiwgb29rIGthbiBoZXQgInJlYWRzIiBzbmVsIHZpbmRlbiBpbiBlbGtlIHJlZ2lvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKy0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKw0KfCBSICAgICAgICAgICAgIHwgPGh0dHBzOi8vd3d3LnItcHJvamVjdC5vcmc+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCA0LjQuMSAgICAgICAgICAgICAgICB8IFIgaXMgZGUgY29kZSB0YWFsIGRpZSBnZWJydWlrdCB3b3JkdCBvbSBhbGxlIHN0YXRpc3RpZWtlbiB0ZXN0ZW4gdGUgZG9lbiBlbiB0ZXZlbnMgZGUgdmlzdWFsaXNhdGllIHZhbiBkZSBkYXRhIGRpZSBrb210IHVpdCBoZXQgb25kZXJ6b2VrICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKy0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKw0KfCBSLXN0dWRpbyAgICAgIHwgPGh0dHBzOi8vcG9zaXQuY28+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAyMDIzLjEyLjErNDAyICAgICAgICB8IFIgc3R1ZGlvIGlzIGhldCBwcm9ncmFtbWEgd2F0IHdvcmR0IGdlYnJ1aWt0IGFscyBJREUgdm9vciBSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKy0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKw0KfCBOQ0JJLUdFTyAgICAgIHwgPGh0dHBzOi8vd3d3Lm5jYmkubmxtLm5paC5nb3YvZ2VvLz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICB8IE5DQkktR0VPIGlzIGdlYnJ1aWt0IG9tIGhldCBvcmlnaW5lbGUgb25kZXJ6b2VrIHRlIHZpbmRlbiB3YWFyIGRpdCBvbmRlcnpvZWsgaW5zcGlyYXRpZSB2YW5hZiBuZWVtdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKy0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKw0KDQohW1BsYW5uaW5nIC0gVGlqZCB2b29yIG9uZGVyem9layBHZW5vbWljcyAmIFRyYW5zY3JpcHRvbWljc10oaW1hZ2VzL1NjaGVybcKtYWZiZWVsZGluZyUyMDIwMjQtMDktMjQlMjBvbSUyMDE1LjA2LjA5LnBuZyl7d2lkdGg9IjY4MSJ9DQoNCiMjIFdlZWsgMSAtIFByb2plY3QgT3B6ZXQNCg0KKipEb2VsZW4gdmFuIGRlIHdlZWsqKg0KDQpIZXQgbWFrZW4gdmFuIGVlbiB0ZWFtICYgT25kZXJ6b2VrZW4gem9la2VuIG1ldCBwb3RlbnRpZQ0KDQpIZXQgbWFrZW4gdmFuIGVlbiBzYW1lbnZhdHRpbmcgdmFuIGRlIE1ldGhvZGVuDQoNCkhldCBkb3dubG9hZGVuIHZhbiBkZSBkYXRhIGRvb3JtaWRkZWwgdmFuIFNSQQ0KDQoqKlRha2VuIGxpanN0IC0gV2VlayAxKioNCg0KLSAgIFRlYW0gbWFrZW4NCi0gICBMaXRlcmF0dXVyICsgZGF0YSBzZXQgem9la2VuDQotICAgV2VlayBwbGFubmluZyBtYWtlbg0KLSAgIEFmbWFrZW4gTWV0aG9kZW4NCi0gICBIZXJsZXplbiBkb2N1bWVudA0KLSAgIENoZWNrZW4gTWV0aG9kZW4NCi0gICBCYXNoIHNjcmlwdCBzY2hyaWp2ZW4gdm9vciBkZSBkb3dubG9hZA0KLSAgIERlIFNSQSB1bnBhY2tlbiBlbiBkYXRhIGNvbnRyb2xlcmVuDQoNCkluIGRlIGtsYXMgaXMgZXIgZWVuIGdyb2VwIGdlbWFha3Qgc2FtZW4gbWV0IEZsb3JpcywgU3Rvcm0gZW4gSXZhci4gV2lqIHZpZXJlbiBoZWJiZW4gYWxzIGRvZWxzdGVsbGluZyBlZW4gZ29lZCBlbiBpbnRlcmVzc2FudCBvbmRlcnpvZWsgdGUgcHJlc2VudGVyZW4uIERlIG1vdGl2YXRpZSBpbiBkZXplIGdyb2VwIGlzIGR1cyBlZW4gZ29lZGUgYmFzaXMgb20gb3AgdGUgYm91d2VuLg0KDQpEZSBEYXRhIHNldCB6b2VrZW4gd29yZCBnZWRhYW4gdmlhIE5DQkkgaW4gZGUgR0VPIGRhdGFzZXRzIGNhdGFnb3JpZSBtZXQgZGUgdm9sZ2VuZGUgem9layBvcGRyYWNodCBkaWUgYWxzIHN0YW5kYWFyZCBpcyBnZXN0ZWxkIGRvb3IgZGUgb3BkcmFjaHQgZ2V2ZXJzOiAiKCJleHByZXNzaW9uIHByb2ZpbGluZyBieSBoaWdoIHRocm91Z2hwdXQgc2VxdWVuY2luZyJbRGF0YVNldCBUeXBlXSkgQU5EICJnZW5vbWUgdmFyaWF0aW9uIHByb2ZpbGluZyBieSBoaWdoIHRocm91Z2hwdXQgc2VxdWVuY2luZyJbRGF0YVNldCBUeXBlXSINCg0KQWFuIGRlemUgcXVlcnkga2FuIGFhbiBoZXQgZWluZGUgbm9nIGVlbiB3b29yZCBvZiBvbmRlcndlcnAgdG9lZ2V2b2VnZCB3b3JkZW4uIEluIG9uemUgZ3JvZXAgaXMgYmVzcHJva2VuIG5hYXIgd2F0IG9uemUgaW50ZXJlc3NlcyB3YXJlbiBlbiBoZXQgaG9vZmQgaWRlZSB3YXMgImFnaW5nIiBvb2sgd2VsIHZlcm91ZGVyaW5nLiBEaXQga29tdCBvbWRhdCBnZW4gZXhwcmVzc2llIHZlcmFuZGVyZCBuYWFybWF0ZSBlZW4gb3JnYW5pc21lIG91ZGVyIHdvcmQuIERpdCBpcyBhbmRlcnMgaW4gZWxrIG9yZ2FuaXNtZSBlbiBkYWFyZG9vciB3b3JkIGVyIHZlZWwgb25kZXJ6b2VrIG5hYXIgZ2VkYWFuLiBXaWogemlqbiBnZWtvbWVuIG9wIDMgb25kZXJ6b2VrZW4gZGllIHVpdCBlaW5kZWxpamsgaW50ZXJlc3NhbnQgd2FyZW4NCg0KIyMjIE5pZXQgZ2Vrb3plbiBPbmRlcnpvZWtlbg0KDQotICAgQFpoYW5nMjAyMSA6IE1pbmlDQUZFLCBhIENSSVNQUi9DYXM5LWJhc2VkIGNvbXBhY3QgYW5kIHBvdGVudCB0cmFuc2NyaXB0aW9uYWwgYWN0aXZhdG9yLCBlbGljaXRzIGdlbmUgZXhwcmVzc2lvbiBpbiB2aXZvLiBEaXQgb25kZXJ6b2VrIGdhYXQgb3ZlciBDUklTUFItYmVtaWRkZWxkZSBnZW4gYWN0aXZhdGllLiBEaXQgaXMgZWVuIGJlbG92ZW5kZSBnZW4gdmVyYW5kZXJpbmdzdHJhdGVnaWUgZGllIEROQSBrYW4gdmVyYW5kZXJlbiB6b25kZXIgZGF0IGRlIGR1YmJlbGUgaGVsaXggYnJlZWt0LiBEZXplIGlzIGxhdGVuIGNvbnRyb2xlcmVuIGRvb3IgZGUgb3BkcmFjaHRnZXZlciBlbiBkaWUgemVpIGhldCB2b2xnZW5kZSAiSW50ZXJlc3NhbnQgb25kZXJ6b2VrIGVuIGxldWsgYXJ0aWtlbCwgbWFhciB2b2xnZW5zIG1paiB6aWpuIGVyIHZvb3IgaGV0IFJOQS1TZXEgZ2VkZWVsdGUgdm9vciBkZSBtZWVzdGUgZ3JvZXBlbiBtYWFyIDIgcmVwbGljYXRlbiBiZXNjaGlrYmFhciB0ZXJ3aWpsIHdlIGRhYXIgbWluaW1hYWwgMyB3aWxsZW4gaGViYmVuLiBNb2NodGVuIGp1bGxpZSBuaWV0IGlldHMgYW5kZXJzIGt1bm5lbiB2aW5kZW4gZGFuIGt1bm5lbiB3ZSBkaXQgZXhwZXJpbWVudCBhbHNub2cgZ2VicnVpa2VuLCBtYWFyIGRhYXIgeml0dGVuIHdlbCB3YXQgcmlzaWNvJ3MgYWFuLiIgSGllcmRvb3IgemlqbiB3ZSBnYWFuIGtpamtlbiBuYWFyIGFuZGVyZSBvcHRpZXMuDQoNCi0gICBAVGFrYXN1Z2kyMDIzIDogR2VuZSBleHByZXNzaW9ucyBhc3NvY2lhdGVkIHdpdGggbG9uZ2VyIGxpZmVzcGFuIGFuZCBhZ2luZyBleGhpYml0IHNpbWlsYXJpdHkgaW4gbWFtbWFscy4gRGl0IG9uZGVyem9layBoYWRkZW4gd2lqIGFscyB0d2VlZGUgb3B0aWUgZ2V2b25kZW4sIGhldCBvbmRlcnpvZWsgZ2FhdCBvdmVyIGdlbiBleHByZXNzaWUgZ2Vhc3NvY2llZXJkIG1ldCBsYW5nZXJlIGxldmVuc3NwYW4gZW4gdmVyb3VkZXJpbmcgbGF0ZW4gZ2VsaWprZW5pcyB6aWVuIGluIHpvb2dkaWVyZW4uIERpdCBvbmRlcnpvZWsgaXMgbmlldCBnZWtvemVuIGRvb3IgZGUgb25iZXNjaGlrYmFhcmhlaWQgdmFuIGRlIERBVEEuXA0KDQojIyMgR2Vrb3plbiBvbmRlcnpvZWsNCg0KLSAgIEBNYTIwMjQgOiBUaHJlZS1kaW1lbnNpb25hbCBjaHJvbWF0aW4gcmVvcmdhbml6YXRpb24gcmVndWxhdGVzIEIgY2VsbCBkZXZlbG9wbWVudCBkdXJpbmcgYWdlaW5nLiBEaXQgaXMgZGUga2V1emUgZ2V3b3JkZW4gZG9vciBkZSBhYW53ZXppZ2hlaWQgdmFuIHZlZWwgZGF0YS4gRGl0IHppam4gaW4gdG90YWFsIDc2IHNhbXBsZXMgZGllIGdlbm9tZW4gemlqbiB2YW4gZGUgam9uZ2UgZW4gb3VkZXJlIG11aXplbi4gRGV6ZSBzYW1wbGVzIHppam4gdmFuIG1lZXJkZXJlIGNhdGFnb3JpZW4gbWFhciB2b29yIG9ucyBiZWxhbmdyaWprIHppam4gZGUgdmVyc2NoaWxsZW5kZSBSTkEgc2FtcGxlcy4gSGV0IGRvZWwgdmFuIGRpdCBvbmRlcnpvZWsgaXMgb29rIGVyZyBpbnRlcnJlc2FudCBlbiB3aWogaGViYmVuIG5hIGhldCBsZXplbiBnZWxpamsgYWwgbmlldXdlIGRpbmdlbiBnZWxlZXJkLiBXYXQgZXIgdWl0IHNwcm9uZyB3YXMgZGUgQS9CIGNvbXBhcnRlbm1lbnQgaW4gZGUgbnVjbGV1cy4gRGl0IGlzIGVlbiByZWNlbnRlIG9udGRla2tpbmcgZW4gemVndCBkYXQgZXIgZWVuIEEgY29tcGFydGVtZW50IGlzIHdhYXIgZGUgZ2VuZW4gd29yZGVuIGV4cHJlc3NlZCBtYWFyIGluIGhldCBCIGNvbXBhcnRlbWVudCB3b3JkZW4gZGUgZ2VuZW4gbmlldCBleHByZXNzZWQuIERlemUgdHdlZSBjb21wYXJ0ZW1lbnRlbiB6aXR0ZW4gbm91dyBiaWogZWxrYWFyIGVuIGxhYXQgZHVzIHppZW4gZGF0IGVyIHdlbCBzdHJ1Y3R1dXIgeml0IGluIHdhYXIgZWVuIGdlbiB6aXQgZW4gd2FhciBoZXQgbmlldCB6aXQgaW4gZGUgY2VsLg0KDQojIyMgV2VlayBwbGFubmluZw0KDQpEb29yIG1pZGRlbCB2YW4gaGV0IHByb2dyYW1tYSBUcmVsbG8gaXMgZXIgZWVuIHdlZWsgcGxhbm5pbmcgZ2VtYWFrdC4gSGllciB3b3JkZW4gb29rIGRlIHRha2VuIHZlcmRlZWxkIGRpdCBpcyB0ZSB6aWVuIGFhbiBkZSBmb3RvJ3MgYmlqIGRlIHRpY2tldHMuIERlIGZvdG8gbGFhdCBlZW4gZ2VicnVpa2VyIHppZW4sIGRpdCBnZWNvbWJpbmVlcmQgbWV0IGRlIGRhdHVtIHdhYXIgdm9vciBoZXQgYWYgbW9ldCB6aWpuIGdlZWZ0IG9ucyBlZW4gZHVpZGVsaWprZSB2ZXJkZWxpbmcuIERlIGRhdHVtIHRvZXZvZWdpbmcgZ2VlZnQgZGUgZ2VicnVpa2VyIGRpZSBkZSB0aWNrZXQgaGVlZnQgb29rIGVlbiBoZXJpbm5lcmluZy4NCg0KSGllciBlZW4gdm9vcmJlZWxkIGZvdG8uDQoNCiFbKlRyZWxsbyBwbGFubmluZypdKGltYWdlcy9TY2hlcm3CrWFmYmVlbGRpbmclMjAyMDI0LTA5LTE2JTIwb20lMjAxMy4xOS4yMS5wbmcpDQoNCkhpZXIgemV0dGVuIHdpaiB0aWNrZXRzIGluIGRpZSBhYW4gYmVwYWFsZGUgcGVyc29uZW4gbWV0IHZlcnNjaGlsbGVuZGUgdXJnZW50aWVzDQoNCi0gICBNVVNUIC0gTW9ldCBnZWRhYW4gd29yZGVuIHZvb3IgZWVuIGJlcGFhbGRlIGRhdHVtIG9mIGhldCBlaW5kZSB2YW4gaGV0IHByb2plY3QuDQoNCi0gICBTSE9VTEQgLSB6b3UgZ2VkYWFuIG1vZXRlbiB3b3JkZW4gd2FudCBqZSB3aWwgaGV0IHByb2plY3QgbGlldmVyIG5pZXQgb3BsZXZlcmVuIHpvbmRlci4NCg0KLSAgIENPVUxEIC0ga2FuIGdlZGFhbiB3b3JkZW4gbWFhciBpcyB6ZWtlciBuaWV0IGVzc2VudGllZWwgdm9vciBoZXQgcHJvamVjdC4NCg0KRGUgcGxhbm5pbmcgdmFuIGRlIHdlZWsgdm9vciBtaWogd2FzIGRhdCBpayBkZSBNZXRob2RlbiBtb2VzdCBiZWtpamtlbiBlbiBzYW1lbnZhdHRlbiB2b29yIHpvdmVyIG1vZ2VsaWprIHpvZGF0IGRlIGJlbGFuZ3JpamtzdGUgZGVsZW4gaGllcnZhbiBpbiBoZXQgUFZBIGVuIGRlIFBvd2VycG9pbnQgd2VyZGVuIGdlemV0Lg0KDQpEZSBtZXRob2RlbiB6aWpuIGJlbGFuZ3Jpamsgb21kYXQgaGllcmluIGRlIGJlbm9kaWdkaGVkZW4gc3RhYW4gdm9vciByZXBsaWNhdGllIHZhbiBoZXQgb25kZXJ6b2VrLiBJbiBkZSBnZWtvemVuIHBhcGVyIHdhcmVuIHZlcnNjaGlsbGVuZGUgbWV0aG9kZW4gZGllIHZvb3Igb25zIG5pZXQgYmVsYW5ncmlqayB6aWpuLiBEaXQgemlqbiBiaWp2b29yYmVlbGQgd2FhciBkZSBtdWl6ZW4gemlqbiBnZWtvY2h0IG9mIGRlIEhpLUMgbWV0aG9kZW4sIHZvb3Igb25zIG9uZGVyem9layBpcyBkaXQgbmlldCBiZWxhbmdyaWprIG9tZGF0IHdpaiBhbGxlZW4gbmFhciBkZSBETkEtc2VxIGdhYW4ga2lqa2VuIGluIHZlcmdlbGlqa2luZyBtZXQgaGV0IFJlZmVyZW50aWUgZ2Vub29tIChHUkNtMzkpDQoNCjxodHRwczovL3RyZWxsby5jb20+DQoNCiMjIyBNZXRob2Rlbg0KDQpIZXQgd2V0ZW4gdmFuIGRlIG1ldGhvZGVuIGlzIGJlbGFuZ3Jpamsgb21kYXQgd2lqIG1vZXRlbiB3ZXRlbiB3YXQgd2lqIGt1bm5lbiByZXBsaWNlcmVuIGVuIHdhdCB0ZSB2ZXIgZ2VncmVwZW4gaXMgdm9vciBvbnMgb25kZXJ6b2VrIGVuIGRpdCB6b3Ugb256ZSBvbmRlcnpvZWtzdnJhYWcga3VubmVuIGJlw69udmxvZWRlbi4gQWxzIHdlIEhpLUMgYWxzIHZvb3JiZWVsZCBuZW1lbiBkaXQgaXMgZWVuIGhvZ2UgZG9vcnZvZXIgdGVjaG5pZWsgZGllIGNocm9tYXRpbmUgY29uZm9ybWF0aWUgdmFzdGxlZ3QuIERpdCB6b3VkZW4gd2lqIG5pZXQgaW4gb256ZSA1IHdla2VuIGt1bm5lbiBkb2VuIG9wIGVlbiBnb2VkZSBtYW5pZXIuIERpdCBpcyB3YWFyb20gd2lqIGtpZXplbiB2b29yIGRlIGdlbm9vbSBhbmFseXNlIHZvb3IgYWZ3aWpraW5nZW4gbWV0IGhldCBhbGdlbWVuZSByZWZlcmVudGllIGdlbm9vbS4NCg0KSW4gZGUgbGVzIGhlYiBpayBkZSBtZXRob2RlbiBhZmdlbWFha3QgZXIgd2FyZW4gdWl0IGVpbmRlbGlqayAyNCBtZXRob2RlbiB3YWFyIGRlIG1hdGVyaWFsZW4gZWVuIGJlZXRqZSBpbiBnZW1peHQgc3RvbmRlbiBkaXQgd2FyZW4gZGUgdm9sZ2VuZGUuIEhpZXIgemlqbiBlciBlZW4gcGFhciBkaWUgd2VsIGludGVyZXNzYW50IHppam4gdm9vciBvbnMgZWlnZW4gb25kZXJ6b2VrLiBBbGxlIDI0IG1ldGhvZGVuIHN0YWFuIHNhbWVuIGdldmF0IGluIGVlbiBleHRlcm4gZG9jdW1lbnQgZGllIHRlIHZpbmRlbiBpcyBpbiBkZSBnaXQuDQoNCi0gICBNaWNlIC0gV2FhciBkZSBtdWl6ZW4gdmFuZGFhbiBrd2FtZW4sIGRlIGxlZWZ0aWpkIGVuIHdlbGtlIHR5cGUgbWV0IHdlbGtlIGFhbnBhc3NpbmdlbiBkaXQgd2FyZW4gaW4gb25zIGdldmFsIEM1N0JMLzZKIG11aXplbiB2YW4gOC0xMiB3ZWtlbiBvdWQgdm9vciBkZSBqb25nZW4gZW4gMTAwLTExMCB3ZWtlbiBvdWQgdm9vciBkZSBvdWRlcmUgbXVpemVuDQoNCi0gICBDZWxsIGxpbmVzIC0gRGUgRDM0NSBjZWxsIGxpbmUgZWVuICJXaWxkLXR5cGUgRDM0NSIgdmFuIHlhbGUgemlqbiBnZWN1bHR1cmVlcmQgaW4gUlBNSTE2NDAgbWV0IDEwJSBGQlMgZW4gMXggcGVuaWNpbGxpbiBzdHJlcHRvbXljaW4gb3Bsb3NzaW5nLiBFZW4gdmFyaWF0aWUgdmFuIGRlIFJhZzIgY2VsbCwgRWJmMSBjZWxsIGVuIGRlIFBheDUrIHppam4gZ2Vrd2Vla3QuIHZlcmRlciBvb2sgMjkzVCBtZW5zZWxpamtlIGVtYnJvbmlzY2hlIG5pZXIgY2VsbGVuIGdla29jaHQgdmFuIEFUQ0MgZ2VicnVpa3Qgdm9vciBsZW50aXZpcmFsIGV4cHJlc3NpZS4gUGxhdC1FIGNlbGwgbGluZSBnZWJydWlrdCB2b29yICJyZXRyb3ZpcmFsIiBleHByZXNzaWUuIEFsbGUgY2VsbGVuIHdhcmVuIGdla3dlZWt0IGluIGVlbiAzNyBncmFkZW4gYmV2b2NodGlnZGUgYXRtb3NmZWVyIG1ldCA1JSBDTzINCg0KLSAgIEFudGlib2RpZXMgLSBhbnRpbGljaGFtZW4gemlqbiBpbiBkaXQgb25kZXJ6b2VrIGdlYnJ1aWsgdm9vciAiaW1tdW5vcHJlY2lwaXRhdGlvbiIgb29rIHdlbCBpbW11bm9wcmVjaXBpdGF0aWUgZW4gaGV0ICJzdGFpbmVuIiB2YW4gSDNLMjdhYyB2b29yIGRlICJzdGFpbmluZyIgd29yZGVuIElnRyBpc290eXBlIGNvbnRyb2wgYW50aWxpY2hhbWVuIGdlYnJ1aWt0Lg0KDQotICAgQ2hpcC1zZXEgZW4gSGlDaElQLSBDaHJvbWF0aW5lIGltbXVub3ByZWNpcGl0YXRpZS1zZXF1ZW5jaW5nIG9mIENoSVAtc2VxIGdlbm9lbWQsIGVlbiBuaWV1d2UgbW9sZWN1bGFpcmUgbGFib3JhdG9yaXVtdGVjaG5pZWsgZGllIGRlIEROQS1iaW5kaW5nc2xvY2F0aWVzIHZhbiBlZW4gYmVwYWFsZCBlaXdpdCBpZGVudGlmaWNlZXJkLiBEZSBETkEtZnJhZ21lbnRlbiBkaWUgYWFuIGhldCBzcGVjaWZpZWtlIGVpd2l0IHppam4gdmVyYm9uZGVuLCB3b3JkZW4gb3BnZXZhbmdlbiBtZXQgYmVodWxwIHZhbiBnZXN5bnRoZXRpc2VlcmRlIGltbXVub2dsb2J1bGluZW4sIHdhYXJuYSBkZSBETkEtZnJhZ21lbnRlbiB3b3JkZW4gZ2VzZXF1ZW5jZWQuIERlIHZlcnphbWVsZGUgRE5BLXNlcXVlbnRpZXMgd29yZGVuIGRhYXJuYSBtZXQgYmVodWxwIHZhbiBzb2Z0d2FyZXRvb2xzIGdlYW5hbHlzZWVyZCBvbSBkZSBrd2FsaXRlaXQgdmFuIGRlIENoSVAtc2VxIGVuIG1vZ2VsaWprZSBETkEtYmluZGluZ3Nsb2NhdGllcyB0ZSBldmFsdWVyZW4uIEhpQ2hJUCBpcyBlZW4gcmVjZW50IG9udHdpa2tlbGRlIG1ldGhvZGUgdm9vciBoZXQgb25kZXJ6b2VrZW4gdmFuIGRlIGNvbmZvcm1hdGllIHZhbiBjaHJvbWF0aW5lLCB3YWFyYmlqIGVlbiBpbiBzaXR1IEhpLUMtYmlibGlvdGhlZWsgd29yZHQgdm9vcmJlcmVpZCwgZ2V2b2xnZCBkb29yIGVlbiBjaHJvbWF0aW5lLWltbXVub3ByZWNpcGl0YXRpZXN0YXAgKENoSVApLiBEaXQgcHJvY2VzIGlzIGluIGhldCBhbGdlbWVlbiBnZXJpY2h0IG9wIGRlIGhpc3Rvbm1vZGlmaWNhdGllIEgzSzI3YWMgb2YgY29oZXNpZS4NCg0KLSAgIFByby1CIGNlbGwgcHVyaWZpY2F0aW9uIC0gaGllciB6dWl2ZXJlbiB6ZSBkZSBQcm8tQiBjZWxsZW4gZG9vciBtaWRkZWwgdmFuIHBvc2l0aWV2ZSBzZWxlY3RpZSB2YW4gQ0QxOSsgZW4gQjIyMCBtYXJrZXJzLg0KDQotICAgSW4gc2l0dSBIaS1DIC0gSW4gc2l0dSBIaUMgbWFha3QgZ2VicnVpayB2YW4gZGUgcmVsYXRpZXZlIGZyZXF1ZW50aWUgdmFuIEROQS1ETkEtbGlnYXRpZWdlYmV1cnRlbmlzc2VuIG9tIGRlIGRyaWVkaW1lbnNpb25hbGUgc3RydWN0dXVyIHZhbiBlZW4gZ2Vub29tIHRlIGhlcm9wYm91d2VuLiBPcCBkZXplIG1hbmllciB3b3JkZW4gcmVzdHJpY3RpZS1lbnp5bXZlcnRlZXJkZSB1aXRlaW5kZW4gdmFuIGdlbm9taXNjaCBETkEgaW4gdmFzdGUga2VybmVuIGFhbmdlZ2V2ZW4gbWV0IGdlYmlvdGlueWxlZXJkZSBkTlRQJ3MuIEROQS1ETkEtbGlnYXRpZWdlYmV1cnRlbmlzc2VuIGRpZSBvbnRzdGFhbiBkb29yIG5hYmlqaGVpZHNsaWdhdGllIHdvcmRlbiBkYWFybmEgdmFzdGdlbGVnZCwgdmVyc3Rlcmt0IGVuIGluIGRlIHZvbGdlbmRlIGdlbmVyYXRpZSBnZXNlcXVlbmNlZCBvbSBodW4gbGluZWFpcmUgZ2Vub21pc2NoZSBwb3NpdGllIHZhc3QgdGUgc3RlbGxlbiwgZW4gaHVuIGRyaWVkaW1lbnNpb25hbGUgcmVsYXRpZS4NCg0KLSAgIFJOQS1zZXEsIERlIFJOQS1zZXEgaXMgbmlldCBoZWVsIGJlbGFuZ3Jpamsgdm9vciBvbnMgZ2Vub21pY3MgZGVlbCBlY2h0ZXIgaXMgaGV0IHdlbCBiZWxhbmdyaWprIHZvb3IgaGV0IHRyYW5zY3JpcHRvbWljcyBkZWVsLiBEaXQgd2lqc3Qgb3AgaG9lIGRlIFJOQSBpcyBnZXNlcXVlbmNlZC4gRXIgemlqbiB2ZXJzY2hpbGxlbmRlIGJhc2lzIHBhcmVuIGxlbmd0ZW4gZ2VicnVpa3Q6IDJ4NzUsIDF4MTAwICwgMngxMDBicCBkZXplIHppam4gYWxsZW1hYWwgZ2VzZXF1ZW5jZWQgb3AgZWVuIElsbHVtaW5hIE5vdmFTZXEgc2VxdWVuY2VyLiBEZSBtYXBwaW5nIGlzIGdlZGFhbiBuYWFyIGhldCBtbTEwIGdlbm9vbSBkb29yIG1pZGRlbCB2YW4gU1RBUi4gU1RBUiBpcyBlZW4gYWxpZ25lciBnZW1hYWt0IG9tIHNwZWNpZmllayBkZSB2ZWxlIHVpdGRhZ2luZyBhYW4gdGUgcGFra2VuIHZhbiBSTkEtc2VxIGRhdGEgbWFwcGluZy4gSGV0IGdlYnJ1aWt0IGVlbiBzdHJhdGVnaWUgb20gcmVrZW5pbmcgdGUgaG91ZGVuIHZvb3IgZGUgInNwbGljZWQiIGFsaWdubWVudHMuDQoNCk5hIGFsbGUgbWV0aG9kZW4gc2FtZW5nZXZhdCB0ZSBoZWJiZW4gZ2luZ2VuIHdpaiBhbHMgZ3JvZXBqZSBraWprZW4gbmFhciBkZSBtYXRlcmlhbGVuIGVuIG1ldGhvZGVuIG9tIHRlIGJlc2xpc3NlbiB3YXQgd2lqIG5vZGlnIGhhZGRlbiwgd2F0IG91dGRhdGVkIHdhcyBlbiB3YXQgd2lqIG5vZyBleHRyYSBvZiBhbmRlcnMgd2lsZGVuIGRvZW4uDQoNCioqT256ZSBnZWtvemVuIG1ldGhvZGVuICYgbWF0ZXJpYWxlbioqDQoNCi0gICAqKk11aXMtR2VuOioqIFdpaiBoZWJiZW4gaW4gb25zIG9uZGVyem9layBlZW4gYW5kZXIgbXVpcy1nZW4gZGFuIGhldCBnZW4gZGF0IGdlYnJ1aWt0IGlzIGluIGhldCByZWZlcmVudGllIG9uZGVyem9layBATWEyMDI0ICwgZGl0IGlzIG9tZGF0IGhldCByZWZlcmVudGllIG9uZGVyem9layBlZW4gcmVkZWxpamsgb3VkIG11aXMtZ2VuIGdlYnJ1aWt0IGRpdCBpcyBoZXQgbW0xMCBnZW4gZGV6ZSBrb210IHVpdCAyMDEyLiBXaWogZ2VicnVpa2VuIGRlIEdSQ20zOSBvb2sgd2VsIGhldCBtbTM5IGdlbi4gV2lqIGdhYW4gZGl0IGdlbiBnZWJydWlrZW4gb20gdGUga2lqa2VuIG9mIGVyIHZhcmlhdGllIGluIHppdCB0dXNzZW4gb256ZSBtdWl6ZW4gZW4gZGl0IG5pZXV3ZXJlIHJlZmVyZW50aWUgZ2VuLCBkaXQgbmlldXdlcmUgZ2VuIGthbiBvbnMgZHVzIG5pZXV3IGluemljaHQgZ2V2ZW4gb3AgbW9nZWxpamtlIHZhcmlhdGllcyAvIG11dGF0aWVzLiBEZSByZWRlbiB2b29yIGdlYnJ1aWsgaXMgZHVzIGRhdCBkaXQgbmlldXdlcmUgZ2Vub29tIHZhbiBiZXRlcmUga3dhbGl0ZWl0IG1vZXQgemlqbiBkYW4gZGUgbW0xMC4NCg0KLSAgICoqRmFzdFFDKio6IERpdCBwcm9ncmFtbWEgaGViYmVuIHdlIGdlYnJ1aWt0IG9tIGRlIGt3YWxpdGVpdCB2YW4gZGUgZGF0YSB0ZSBiZWtpamtlbiwgRmFzdFFDIGlzIGVlbiBwcm9ncmFtbWEgd2F0IGZhc3RhIGVuIGZhc3RxIGZpbGVzIGthbiBpbmxlemVuIGRpdCBrYW4gdmlhIGNvbW1hbmRsaW5lLCB2aWEgZ2FsYXh5IChlZW4gd2Vic2l0ZSBtZXQgYmlvIGluZm9ybWF0aWNhIHRvb2wpIGVuIGVlbiBGYXN0UUMgcHJvZ3JhbW1hIG1ldCBHVUkuIEZhc3RRQyBiZW9vcmRlZWxkIGRlIGZpbGVzIHZpYSB2ZXJzY2hpbGxlbmRlIHRlc3RzIGVuIGFuYWx5emVuLiBEZXplIHRlc3RzIGVuIGFuYWx5emVuIHppam4gd2F0IGRpZXBlciB1aXRnZWxlZ3QgaW4gaGV0IEZhc3RRQyBob29mZHN0dWsgaW4gdGFiZWwgMS4gRGUgcmVkZW4gdm9vciBnZWJydWlrIHZhbiBmYXN0UUMgaXMgZHVzIG9tZGF0IGhldCBlZW4gemVlciBiZXRyb3V3YmFhciBwcm9ncmFtbWEgKGRvb3IgaGV0IGdlYnJ1aWsgaW4gdmVsZSB3ZXRlbnNjaGFwcGVsaWprZSBhcnRpa2VsZW4pIGlzIGVuIG1ha2tlbGlqayB0ZSBnZWJydWlrZW4gaXMuDQoNCi0gICAqKlRyaW1tb21hdGljKio6IERpdCBwcm9ncmFtbWEgaGViYmVuIHdlIGdlYnJ1aWt0IG9tIGRlIGRhdGEgbmEgRmFzdFFDIGhvZ2VyZSBrd2FsaXRlaXQgdGUgbWFrZW4uIERpdCBwcm9ncmFtbWEgZ2VicnVpa3QgdmVyc2NoaWxsZW5kZSBwYXJhbWV0ZXJzIG9tIGRlIEROQS1zZXEgYWFuIHRlIHBhc3NlbiB6b2RhdCBkZSBrd2FsaXRlaXQgZ29lZCBnZW5vZWcgd29yZHQgb20gZGl0IHRlIGt1bm5lbiBnZWJydWlrZW4uIERlIHJlZGVuIGRhdCBkZSBkYXRhIHdlbCBtZXQgZ29laWUga3dhbGl0ZWl0IGthbiB3b3JkZW4gZ2VicnVpa3QgaXMgb21kYXQgaGV0IGRhbiBiZXRyb3V3YmFhciBpcy4gRGUgcmVkZW4gZGF0IHdpaiB0cmltbW9tYXRpYyBnZWJydWlrZW4gaXMgb21kYXQgU3Rvcm0gZW4gSXZhciBhbCB2ZWVsIGVydmFyaW5nIGhlYmJlbiBtZXQgdHJpbW1vbWF0aWMgZW4gZGV6ZSB0b29sIGlzIGdlbWFha3QgZG9vciBpbGx1bWluYSBlZW4gYmVkcmlqZiB3YXQgZ29lZCBiZWtlbmQgc3RhYXQgb20gemlqbiBzZXF1ZW5jZXJzIGR1cyBlZW4gZ2V2ZXN0aWd0IGJlZHJpamYsIHdhYXJkb29yIGhldCBlZW4gYmV0cm91d2JhcmUgdG9vbCBpcy4NCg0KLSAgICoqQndhLW1lbTIqKjogR2VicnVpa3Qgb20gRE5BLXNlcSB0ZSBhbGlnbmVyZW4gbWV0IG9ucyByZWZlcmVudGllZ2Vub29tLiBIZXQga2FuIGtvcnRlIGVuIG1pZGRlbGxhbmdlIEROQS0gb2YgUk5BLXJlYWRzIGFsaWduZW4uIFZvb3Igb25zIGlzIFdob2xlIGdlbm9tZSBzZXF1ZW5jaW5nIGludGVycmVzYW50IGRpdCBpcyBvbWRhdCBoaWVyYmlqIGRlIGdlbm9tZW4gd29yZGVuIGdlc2NhbmQgZW4gZGFuIHZlcmdlbGVrZW4gbWV0IGhldCBnZWtvemVuIHJlZmVyZW50aWUgZ2Vub29tIChpbiBvbnMgZ2V2YWwgbW0zOSAtIEdDRl8wMDAwMDE2MzUuMjcpIGRpdCBvbSBnZW5ldGlzY2hlIHZhcmlhdGllcyB0ZSBpZGVudGlmaWNlcmVuLiBEZSByZWRlbiB3YWFyb20gd2lqIGJ3YS1tZW0yIGdlYnJ1aWtlbiBlbiBuaWV0IFNUQVIgaXMgb21kYXQgQndhLW1lbTIgYmV0ZXIgaXMgdm9vciBETkEgZGl0IGlzIG9tZGF0IFNUQVIgZ2VzcGVjaWFsaXNlZXJkIGlzIGluIFJOQS1zZXEgb29rIGlzIGJ3YS1tZW0yIGhlZWwgYWNjdXJhYXQgdm9vciBETkEgc2VxdWVuY2VzIGFsbGlnbm1lbnQsIGhldCBnYWF0IGdvZWQgb20gbWV0IG1pc21hdGNoZXMsIGtsZWluZSBpbmRlbHMgZW4gbGFuZ2VyZSByZWFkcy4gSGV0IHZvb3JkZWVsIHZhbiBid2EtbWVtMiBpcyBvb2sgZGF0IGhldCBtaW5kZXIgendhYXIgaXMgb3AgZGUgbWVtb3J5IHZhbiBkZSBwYydzLiBATXVzaWNoMjAyMQ0KDQotICAgKipGcmVlYmF5ZXMqKjogRGl0IHByb2dyYW1tYSBraWprdCBuYWFyIGRlIGFsaWduZW1lbnQgdm9vciBhZndpamtpbmdlbiBtZXQgaGV0IHJlZmVyZW50aWUgZ2Vub29tIGVuIGdlZWZ0IGRlemUgYWFuLiBEZSByZWRlbiBkYXQgd2lqIGZyZWViYXllcyBnZWJydWlrZW4gaXMgZGUgZ29lZGUgZG9jdW1lbnRlbnRhdGllIGVuIGhldCBtYWtrZWxpamtlIGluc3RhbGxhdGllIHByb2Nlcy4gRGUgYmFzaCBzY3JpcHRzIHZvb3IgZnJlZWJheWVzIHppam4gbWFra2VsaWprIGdlbWFha3QgZW4gcHJvYmxlbWVuIGt1bm5lbiBzbmVsIHdvcmRlbiB2ZXJob2xwZW4gbWV0IGRlIGRvY3VtZW50YXRpZSBkaWUgb3AgZGUgZ2l0IHN0YWF0Lg0KDQojIyMgRG93bmxvYWQgLSBTUkEgc2NyaXB0IG1ldCBwcmVmZXRjaA0KDQpFZXJzdCB3ZXJkIG9ucyBnZXZyYWFnZCBvbSBuYWFyIGRlIGp1aXN0ZSBtYXAgdGUgZ2Fhbi4gRGl0IGthbiBkb29yIGRlIHRlcm1pbmFsIHRlIG9wZW5lbiBuYWFyIG9uemUgaG9tZSB0ZSBnYWFuIGVuIGNkIG5hYXIgL3N0dWRlbnRzLzIwMjQtMjAyNS9UaGVtYTA1LyBlbiBoaWVyIGRlIG1hcCB2b29yIG9ucyBwcm9qZWN0IGFhbiB0ZSBtYWtlbi5cDQpPZiBoZXQga2FuIGdld29yZGVuIG1ldCBkZSBHVUkgd2FhciBqZSBvb2sgYmVnaW50IG1ldCBoZXQgb3BlbmVuIHZhbiBkZSBob21lIGZvbGRlciBlbiBkYW4gaW4gZGUgem9la2JhbGsgaGV0IHZvbGdlbmRlIHR5cGVuICIvc3R1ZGVudHMvMjAyNC0yMDI1L1RoZW1hMDUvIiBIaWVyIGhlYmJlbiB3aWogZGUgbWFwIGFhbmdlbWFha3QgZ2VuYWFtZCAiM2Rjb25mb3JtYXRpZUNob21hdGluZSIgZWVuIHZlcmtvcnRlIGJlbmFtaW5nIHZhbiBkZSBwYXBlci4gSGllciBpbiBtb2VzdCBub2cgZWVuIG1hcCBnZW1hYWt0IHdvcmRlbiBkaWUgU1JBIG1vZXN0IHdvcmRlbiBnZW5vZW1kLiBEZSBkYXRhIG1vZXN0ZW4gd2lqIHZhbiBkZSBuY2JpIGdlbyB3ZWJzaXRlIGFmaGFsZW4gZG9vciBlZW4gU3JhQWNjTGlzdCB0ZSBkb3dubG9hZGVuLiBEZXplIGJldmF0dGUgZGUgbmFhbS1jb2RlcyBkaWUgd2lqIGRhbiBpbiBoZXQgc3lzdGVlbSBrdW5uZW4gb3Byb2VwZW4gb20gemUgdmVydm9sZ2VucyBkYWFyIHRlIGRvd25sb2FkZW4gZW4gdW5wYWNrZW4uDQoNCkhpZXJvbmRlciBpcyBoZXQgc2NyaXB0IHRlIHppZW4gZGllIGdlYnJ1aWt0IGlzIG9tIGRlIFNyYUFjY0xpc3QgYWFuIHRlIHJvZXBlbiBkZXplIHRlIGxlemVuIGVuIGRhYXJuYSB3b3JkdCDigJRvdXRwdXQgZ2VicnVpa3Qgb20gaGVtIGluIGRlIGdvZWRlIG1hcCB0ZSB6ZXR0ZW4gIlxcIiBnZWVmdCBlZW4gbmV3IGxpbmUgYWFuIGVuIGRlIC0gLW1heC1zaXplIDIwMGcgZ2VlZnQgYWFuIGRhdCBkZSBwYWNrZWQgZmlsZXMgbmlldCBtZWVyIG1vZ2VuIHppam4gZGFuIDIwMCBnaWdhYnl0ZXMNCg0KYGBge2Jhc2gsIGV2YWw9RkFMU0V9DQojIEhpZXIgd2lsIGlrIGRhdCBwcmVmZXRjaCBpbiBkZSBtYXAgdGUga2lqa2VuIFNSQSB2b29yIGRlIGdlZG93bmxvYWRlIFNyYUFjY0xpc3QgZGV6ZSB3b3JkdCBnZWJydWlrdCBvbSBkZSBmaWxlcyBkaWUgaWsgd2lsIHRlIHpvZWtlbiBpbiBkZSBOQ0JJIGRhdGFiYXNlDQpwcmVmZXRjaCAkKDwvc3R1ZGVudHMvMjAyNC0yMDI1L1RoZW1hMDUvM2Rjb25mb3JtYXRpZUNocm9tYXRpbmUvU1JBL1NyYUFjY0xpc3QuY3N2KSAtLW91dHB1dC1kaXJlY3RvcnkgXA0KL3N0dWRlbnRzLzIwMjQtMjAyNS9UaGVtYTA1LzNkY29uZm9ybWF0aWVDaHJvbWF0aW5lL1NSQS8gLS1tYXgtc2l6ZSAyMDBHDQoNCmBgYA0KDQpQcmVmZXRjaCBpcyBkZWVsIHZhbiBkZSBTUkEgdG9vbGtpdCwgZGl0IHByb2dyYW1tYSBkb3dubG9hZHMgUnVucyAoc2VxdWVuY2UgZmlsZXMgaW4gaGV0IGdlY29tcHJlc3NlcmRlIFNSQSBmb3JtYXQpIGVuIGFsbGUgYmlqYmVob3JlbmRlIGRhdGEgYmVub2RpZ2Qgb20gZGUgUnVuIHZhbiBoZXQgU1JBIGZvcm1hdCBuYWFyIGVlbiBtZWVyIGJydWlrYmFyZSBmaWxlIGZvcm1hdCBvbSB0ZSB6ZXR0ZW4uIERlemUgZmlsZSBmb3JtYXRzIGt1bm5lbiBmYXN0YSBvZiBmYXN0cSB6aWpuIGJpanZvb3JiZWVsZC4gUHJlZmV0Y2gga2FuIG9vayB3b3JkZW4gZ2VicnVpa3Qgb20gaW5jb21wbGV0ZSBSdW4gZG93bmxvYWRzIGFmIHRlbWFrZW4gZW4gdGUgY29ycmlnZXJlbi4NCg0KU1JBIFRvb2xraXQgUmVsZWFzZSAzLjEuMSBpcyBnZWJydWlrdC4gaW4gZGV6ZSB0b29sa2l0IHppdHRlbiB2ZXJzY2hpbGxlbmRlIHRvb2xzIGRpZSBnZWJydWlrdCB3b3JkZW4uIERlIHJlZGVuIGRhdCB3aWogZGV6ZSB0b29sa2l0IGdlYnJ1aWtlbiBpcyBvbWRhdCBkZXplIHZhbiBOQ0JJIGtvbXQgZGl0IGlzIG9vayBoZXQgcGxhdGZvcm0gd2FhcnZhbmRhYW4gd2lqIG9uemUgZGF0YSBoYWxlbiBkaXQgem91IGR1cyBoZXQgbWFra2VsaWprc3RlIG1vZXRlbiB3ZXJrZW4uDQoNCkhldCBTUkEgZmlsZSB6aWV0IGVyIGhlZWwgc2ltcGVsIHVpdA0KDQpTUlIyNjk4MDU0OVwNClNSUjI2OTgwNTUwXA0KU1JSMjY5ODA1NTFcDQpTUlIyNjk4MDU1Mg0KDQpIZXQgemlqbiBkZSBuYW1lbiB2YW4gZGUgc2FtcGxlcyBuZXRqZXMgb25kZXIgZWxrYWFyLg0KDQojIyBXZWVrIDIgLSBEYXRhIGRvd25sb2FkICsgS3dhbGl0ZWl0IGNoZWNrDQoNCioqRG9lbGVuIHZhbiBkZSB3ZWVrKioNCg0KRGUgU1JBIGRhdGEgdWl0cGFra2VuIGVuIGRlIEZhc3RRIGJla2lqa2VuDQoNClRlc3QgZGF0YSBtYWtlbg0KDQpSZWFkcyBhbGlnbmVuZW4gYWFuIHJlZmVudGllIGdlbm9vbQ0KDQoqKlRha2VuIGxpanN0KioNCg0KLSAgIEJhc2ggc2NyaXB0IHNjaHJpanZlbiB2b29yIGhldCB1aXRwYWtrZW4NCi0gICBGYXN0cSBxdWFsaXR5IGNoZWNrZW4NCi0gICBUZXN0IGRhdGEgbWFrZW4NCi0gICBSZWFkcyBhbGlnbmVuZW4NCg0KIyMjIERhdGEgdWl0cGFra2VuIC0gZmFzdGVycS1kdW1wDQoNCk9tIGRlIFNSQSBkYXRhIG5hYXIgZmFzdHEgb20gdGUgemV0dGVuIGdlYnJ1aWtlbiB3ZSBmYXN0ZXJxLWR1bXAuIGZhc3RlcnEtZHVtcCBpcyBlZW4gcHJvZ3JhbW1hIGluIGRlIFNSQSB0b29sa2l0LCB3aWogZ2VicnVpa2VuIFJlbGVhc2UgMy4xLjEsIERlIHJlZGVuIHZvb3IgaGV0IGdlYnJ1aWsgdmFuIGZhc3RlcnEtZHVtcCBpcyBkZSBnb2VkZSBkb2N1bWVudGF0aWUgZW4gZGUgbGluayBtZXQgTkNCSSB3YWFyIHdpaiBvbnplIGZpbGVzIHZhbmRhYW4gaGFsZW4uIEZhc3RlcnEtZHVtcCB6aXQgb29rIGluIGRlIFNSQSB0b29sa2l0IGRlemUgc3RhYXQgZ2XDr25zdGFsbGVlcmQgb3AgaGV0IHN5c3RlZW0gZGl0IGlzIG1ha2tlbGlqayB0ZSBkb2VuIGRvb3IgbmFhciBkZSBnaXQgdGUga2lqa2VuIHZhbiBGYXN0ZXJxLWR1bXAgb29rIHdlbCBkZSBTUkEgdG9vbGtpdCBnaXQuDQoNCkZhc3RlcnEtZHVtcCBuZWVtdCBkZSBTUkEgZmlsZXMgZW4gZXh0cmFjdCBkZSBkYXRhIGhpZXJ2YW4gbmFhciBmYXN0cS0gb2YgZmFzdGEgZmlsZXMuIGluIG9ucyBnZXZhbCBmYXN0cSBmaWxlcy4NCg0KSGV0IGZhc3RRIGZvcm1hdCBpcyBlZW4gdGV4dCBnZWJhc2VlcmRlIGZvcm1hdCB2b29yIGhldCBvcHNsYWFuIHZhbiBiaW9sb2dpc2NoZSBzZXF1ZW50aWVzIChtZWVzdGFsIG51Y2xlb3RpZGVuIHNlcXVlbnRpZXMpIGFscyBkZSBjb3JyZXNwb25kZXJlbmRlIGt3YWxpdGVpdCdzIHNjb3Jlbi4NCg0KRGUgY29kZSBoaWVyb25kZXIgem9la3QgZWVyc3QgaW4gZGUgU1JBIG1hcCBuYWFyIGZpbGVzIG1ldCBlZW4gZmlsZW5hYW0gZGllIGVpbmRpZ3Qgb3AgLnNyYQ0KDQpkZXplIHJ1bnQgaGlqIHBhcmFsbGVsIHdhdCBiZXRla2VudCBkYXQgaGlqIG1lZXJkZXJlIHByb2Nlc3NlbiBkb2V0IG92ZXIgdmVyc2NoaWxsZW5kZSBjb3Jlcy4gSGlqIHpldCBkZSBmaWxlcyBpbiBlZW4gbmlldXdlIG1hcCBkZSBmYXN0cSBtYXAgZW4gZG9vciBkZSB7fSBiZWhvdWQgaGV0IGRlIG5hYW0gd2Fhcm1lZSBoZXQgd2VyZCBnZWRvd25sb2FkLg0KDQpgYGB7YmFzaCwgZXh0cmFjdF9mYXN0cV9zdWJzZXQsIGV2YWw9RkFMU0V9DQpmaW5kIC9zdHVkZW50cy8yMDI0LTIwMjUvVGhlbWEwNS8zZGNvbmZvcm1hdGllQ2hyb21hdGluZS9TUkEvIC1uYW1lICIqLnNyYSIgfCBcDQogIHBhcmFsbGVsIGZhc3RlcnEtZHVtcCAtTyAvc3R1ZGVudHMvMjAyNC0yMDI1L1RoZW1hMDUvM2Rjb25mb3JtYXRpZUNocm9tYXRpbmUvZmFzdHEvIHt9DQpgYGANCg0KKipFZW4gZmFzdFEgYmVzdGFuZCBoZWVmdCBlZW4gYmVwYWFsZGUgaW5kZWxpbmc6KioNCg0KRWVuIGhlYWRlciwgZGV6ZSBoZWFkZXIgYmVnaW5zdCBtZXQgZWVuIFxAIHRla2VuIHdhdCBnZXZvbGdkIHdvcmR0IGRvb3IgZWVuIHNlcXVlbnRpZSBJRCBlbiBzb21zIGVlbiBiZXNjcmhpanZpbmcgdmFuIHdhdCBoZXQgYmVzdGFuZCBiZXZhdC4gTmEgZGV6ZSBoZWFkZXIga29tZW4gZGUgc2VxdWVuZXRpZXMgZGV6ZSBoZWJiZW4gZWVuIHNjb3JlIGRpZSB3b3JkZW4gYWFuZ2VnZXZlbiBtZXQgZWVuICsgYWxzIHN0YXJ0LiBEZSBzY29yZSB3b3JkdCB3ZWVyZ2VnZXZlbiBpbiBBU0NJSSBjaGFyYWN0ZXJzLCBIZXQgIiEiIHRla2VuIGdlZWZ0IGRlDQoNCkhpZXIgaXMgZWVuIHZvb3JiZWVsZCB2YW4gaG9lIGRlIGZhc3RhIGZpbGUgZXIgdWl0IGthbiB6aWVuOg0KDQpcQFNFUV9JRCAtIHNlcXVlbnRpZSBJRFwNCkdBVFRUR0dHR1RUQ0FBQUdDQUdUQVRDR0FUQ0FBQVRBR1RBQUFUQ0NBVFRUR1RUQ0FBQ1RDQUNBR1RUVCAtIEROQXNlcVwNCisgIScnKigoKCgqKiorKSklJSUrKykoJSUlJSkuMSoqKi0rKicnKSlcKlwqNTVDQ0ZcPlw+XD5cPlw+XD5DQ0NDQ0NDNjUgLSBrd2FsaXRlaXQgaW4gQVNDSUkNCg0KIyMjIEZhc3RhUUMgLSBSYXcgZGF0YSBydW4NCg0KRmFzdFFDIHdvcmR0IGdlYnJ1aWt0IG9tIGRlIGt3YWxpdGVpdCB0ZSBjaGVja2VuIHZhbiBkZSByYXV3ZSBkYXRhLCBoaWVyIHVpdCBpcyB0ZSB6aWVuIG9mIGRlIGRhdGEgZ2VsaWprIHRlIGdlYnJ1aWtlbiBpcyBvZiBkYXQgZGV6ZSBtb2V0IHdvcmRlbiBnZXRyaW1tZWQuIERlIHRyaW1tZXIga2FuIG9vayBhZmdlc3RlbGQgd29yZGVuIG9wIGJhc2lzIHZhbiBkZSBGYXN0cWMuIEBCYWJyYWhhbUJpb2luZm9ybWF0aWNzDQoNCldhYXJvbSB3aWogRmFzdFFDIGdlYnJ1aWtlbiBpcyBvbWRhdCB2b29yIHdpaiBnYWFuIHdlcmtlbiBtZXQgb256ZSBkYXRhIHdpbGxlbiB3aWogemllbiBvZiBkZSBkYXRhIHdlbCBnZXNjaGlrdCBpcyBvbSBtZWUgdGUgd2Vya2VuLiBBbHMgZGUga3dhbGl0ZWl0IGhlZWwgc2xlY2h0IGlzIGRhbiBrdW5uZW4gZXIgbmlldCBiZXRyb3V3YmFyZSByZXN1bHRhdGVuIHVpdCB3b3JkZW4gZ2VoYWFsZCwgZW4gaGV0IGlzIG5pZXQgZ29lZCByZXBsaWNlZXJiYWFyLg0KDQpFciB6aWpuIG1lZXJkZXJlIHJlc3VsdGF0ZW4gZGllIHVpdCBlZW4gRmFzdFFDIGNoZWNrIGtvbWVuIGhpZXIgaXMgZWVuIHVpdGxlZyB3YXQgZXIgdWl0IGtvbXQgZW4gaG9lIGRpdCBnZWxlemVuIG1vZXQgd29yZGVuLg0KDQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rDQp8IENhdGFnb3JpZSAgICAgICAgICAgICAgICAgICAgfCBVaXRzbGFnICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBIb2UgbGVlcyBqZSBkaXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Kz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Kz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0rDQp8IEJhc2ljIHN0YXRpc3RpY3MgICAgICAgICAgICAgfCBIaWVyIGtyaWpnIGplIGVlbiB0YWJlbCBtZXQgdmVyc2NoaWxsZW5kZSBkaW5nZW4gem9hbHMgZGUgRmlsZW5hbWUsIGZpbGUgdHlwZSwgc2VxdWVuY2UgbGVuZ3RoLCAlR0MsIFRvdGFsIHNlcXVlbmNlcywgRW5jb2RpbmcgZW4gZGUgc2VxdWVuY2VzIGZsYWdnZWQgYXMgcG9vciBxdWFsaXR5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBIZXQgYWZsZXplbiB2YW4gZGV6ZSB0YWJlbCBpcyBsZXplbiBlbiBjaGVja2VuIG9mIGVyIGdlZW4gZm91dGVuIGluIHppdHRlbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rDQp8IFBlciBiYXNlIHNlcXVlbmNlIHF1YWxpdHkgICAgfCBFZW4gZ3JhZmllayB6b2FscyB0ZSB6aWVuIGlzIGluIGZpZ3V1ciAxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBEZSBncmFmaWVrIGhlZWZ0IDMgdmxha2tlbiBkaWUgdmFuIHZlcnNjaGlsbGVuZGUgZ3JvdGUgZW4ga2xldXJlbi4gRGUga3dhbGl0ZWl0IHJhbmdlZCB2YW4gMC00MCwgMjgtNDAgaXMgZ29lZCBhbmQgZ2VrbGV1cmQgZ3JvZW4sIDIwLTI4IGlzIGdla2xldXJkIGdlZWwvb3JhbmplLCAwLTIwIGdla2xldXJkIHJvb2QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQp8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQp8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBWZXJkZXIgcmVwcmVzZW50ZWVydCBkZSBnZWxlIGJveCBkZSAyNXRoIHRvIDc1dGggcGVyY2VudGlsZS4gRGUgendhcnRlIGxpam5lbiBnZXZlbiBkZSAxMHRoIGVuIDkwdGggcGVyY2VudGlsZSB3ZWVyLiBEZSBibGF1d2UgbGlqbiBnZWVmdCBkZSBnZW1pZGRlbGRlIHNjb3JlcyB2b29yIGt3YWxpdGVpdHMgY29udHJvbGUgc2NvcmUgdm9vciBkZSBudWNsZW90aWRlLiBnZWJhc2VlcmQgb3AgZGV6ZSBkaW5nZW4gaXMgdGUgemllbiBkYXQgZGUgYmFzZSB2YW4gMSB0b3QgMTAwIGdvZWRlIGt3YWxpdGVpdCBoaWVybmEgZ2FhdCBkZSBrd2FsaXRlaXQgc3RlcmsgbmFhciBiZW5lZGVuLiB3YXQgYWwgYWFuIGdlZWZ0IGRhdCBlciBnZXRyaW1tZWQgbW9ldCB3b3JkZW4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rDQp8IFBlciB0aWxlIHNlcXVlbmNlIHF1YWxpdHkgICAgfCBIaWVyIGlzIGVlbiBwbG90IHRlIHppZW4gd2FhciBkZSByZWFkcyB3b3JkZW4gd2VlcmdlZ2V2ZW4gYWxzIGVlbiBzb29ydCBoZWF0bWFwLiB3YWFyYmlqIGVsa2UgdGVnZWwgMSBlZW4gcmVhZCB3ZWVyZ2VlZnQgb3AgZWVuIGJlcGFhbGRlIHBvc2l0aWUgZGV6ZSBrd2FsaXRlaXQgdmFuIGRlIHJlYWRzIHdvcmRlbiB2ZXJnZWxla2VuIG1ldCBlbGthYXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBIZXQgYWZsZXplbiB2YW4gZGV6ZSBncmFmaWVrIGlzIGRvb3IgdGUga2lqa2VuIG5hYXIgZGUga2xldXIgcGVyIHRlZ2VsIHBlciBwb3NpdGllLiBlZW4gZG9ua2VyYmxhdXdlIHRlZ2VsIGJldGVrZW50IGdvZWRlIGt3YWxpdGVpdCBlbiBob2UgbGljaHRlciBkZSB0ZWdlbCB3b3JkIGhvZSBzbGVjaHRlciBkZSBrd2FsaXRlaXQgZHVzIGxpY2h0YmxhdXcgYmV0ZWtlbnQgZWVuIHNsZWNodGUga3dhbGl0ZWl0LiBPcCBkZSBZLWFzIHN0YWF0IGRhbiBpbiB3ZWxrZSB0aWxlIGhldCBpcyBlbiBkZSBYLWFzIHdlbGtlIHBvc2l0aWUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rDQp8IFBlciBzZXF1ZW5jZSBxdWFsaXR5IHNjb3JlICAgfCBFZW4gZ3JhZmllayBkaWUgamUgZGUgZ2VtaWRkZWxkZSBrd2FsaXRlaXQgb3AgZGVcICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBIZXQgYmVzdGUgaXMgd2FubmVlciBkZSBtZWVzdGUgcmVhZHMgZWVuIGhvZ2UgZ2VtaWRkZWxkZSBrd2FsaXRlaXRzIHNjb3JlIGhlYmJlbiBlbiBlciBnZWVuIGdyb3RlIGRpcCBpbiBkZSBncmFmaWVrIGlzLCBkaXQgYmV0ZWtlbnQgZWVuIGxhZ2Uga3dhbGl0ZWl0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQp8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB4LWFzIGVuIGRlIG51bW1lciB2YW4gc2VxdWVuY2VzIG1ldCBnZW1pZGRlbGRlIG9wIGRlIHktYXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rDQp8IFBlciBiYXNlIHNlcXVlbmNlIGNvbnRlbnQgICAgfCBIaWVyIGlzIGVlbiBwbG90IHRlIHppZW4gbWV0IGVlbiB5LWFzIHdhYXIgMC0xMDAgYWFuZ2VnZXZlbiB3b3JkdCBlbiBlZW4geC1hcyBtZXQgZGUgInBvc2l0aWUgaW4gcmVhZCAoYnApIiBpbiBkZSBncmFmaWVrIHN0YWFuIDQgbGlqbmVuIG1ldCBoZXQgcGVyY2VudGFnZSBwZXIgYmFzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBJbiBmaWd1dXIgMiBpcyBoZXQgdm9sZ2VuZGUgdWl0IGRlIGdyYWZpZWsgdGUgaGFsZW4gZXIgaXMgc2lnbmlmaWNhbnRlIHZhcmlhdGllIGluIGRlIG51Y2xlb3RpZGUgZGlzdHJpYnV0aWUgYWFuIGhldCBiZWluIHZhbiBkZSByZWFkcyBwb3NpdGllIDEtMTAuIERpdCB6b3Uga3VubmVuIHppam4gZG9vciBkZSB2b29yYmVyZWlkaW5nIG9mIGRlIHZvb3Jvb3JkZWxlbiBpbiBoZXQgc2VxdWVuY2VuLiBBLCBULCBDIGVuIEcgemlqbiBuaWV0IGdlbGlqayBnZXJlcHJlc2VudGVlcmQuIG5hIGRlIDEwZGUgcG9zaXRpb2UgemlqbiBkZSBiYXNlIHdhdCBnZXN0YWJpbGl6ZWVyZCB3YXQgYWFuIGdlZWZ0IGRhdCBkZSBzZXF1ZW5jZSBrd2FsaXRlaXQgaW4gZGUgcmVzdCB2YW4gZGUgcmVhZHMgaG9nZXIgemlqbi4gSGV0IGFmZ2VrZXVyZGUga3J1aXMga29tdCBkdXMgZG9vciBkZSBjaG9hcyB2YW4gMS0xMC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rDQp8IFBlciBzZXF1ZW5jZSBHQyBjb250ZW50ICAgICAgfCBQZXIgc2VxdWVuY2UgR0MgY29udGVudCBnZWVmdCB3ZWVyIGVlbiBwbG90IHdlZXIgbWV0IDIgbGlqbmVuLiBFZW4gYmxhdXdlIGxpam4gZGllIGRlIHRoZW9yZXRpc2NoZSBkaXN0cnVidXRpZSBhYW5nZWVmdCB3YXQgZHVzIGVlbiByaWNodGxpam4gaXMsIGVuIGRlIEdDIGNvdW50IHBlciByZWFkIHdhdCBkdXMgZGUgZ2VsZXplbiBkYXRhIGlzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBIZXQgYWZsZXplbiB3b3JkdCBkb29yIGRlIHR3ZWUgbGlqbmVuIHZlcmdlbGlqa2VuLiBoZXQgaXMgaWRlYWFsIGFscyBkZSB0d2VlIGxpam5lbiBvdmVybGFwcGVuIG9mIGRpY2h0YmlqIGVsa2FhciBsaWdnZW4uIFdhbm5lZXIgZXIgbWVlcmRlcmUgcGlla2VuIHppam4gZGllIGFmd2lqa2VuIHZhbiBkZSBibGF1d2UgdGhlb3JldGlzY2hlIGxpam4ga2FuIGRhdCBiZXRla2VuZW4gZGF0IGVyIG1pc3NjaGllbiBzcHJha2UgaXMgdmFuIGJlc21ldHRpbmcgb2Ygc2VxdWVuY2luZyBlcnJvcnMuIEVyIGtvbXQgZHVzIGVlbiByb29kIGtydWlzIHdhbm5lZXIgZGUgR0MgYWJub3JtYWFsIGlzIHZlcmdlbGVrZW4gbWV0IGRlIHRoZW9yZXRpc2NoZSB2ZXJ3YWNodGluZyB3YXQgZHVzIHplZ3QgZGEgZGUgYWxnZW1lbmUga3dhbGl0ZWl0IG5pZXQgZ29lZCBpcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rDQp8IFBlciBiYXNlIE4gY29udGVudCAgICAgICAgICAgfCBEZSBwZXIgYmFzZSBOIGNvbnRlbnQgZ3JhZmllayBnZWVmdCBkZSBmcmVxdWVudGllIHdlZXIgdmFuICJOIiBiYXNlY2FsbHMgb3AgZWxrZSBwb3NpdGllIGluIGRlIHJlYWRzLiBEZSAiTiIgc3RhYXQgdm9vciBlZW4gb256ZWtlcmUgb2Ygb25iZWtlbmRlIG51Y2xlb3RpZGUsIGRlemUga29uIGRlIHNlcXVlbmNlciBuaWV0IGlkZW50aWZpY2VyZW4gYWxzIDEgdmFuIGRlIGJhc2UgKEEsIFQsIEMsIEcpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBYLWFzIGdlZWZ0IGRlIHBvc2l0aWUgd2VlciBpbiBkZSByZWFkcywgWS1hcyBnZWVmdCBoZXQgcGVyY2VudGFnZSB2YW4gcmVhZHMgbWV0IGVlbiAiTiIgYmFzZSBvcCBlbGtlIHBvc2l0aWUuIEVlbiBob2dlIHdhYXJkZSBiZXRla2VudCBkYXQgZGUgc2VxdWVuY2VyIG9wIGRpZSBwb3NpdGllIHZhYWsgb256ZWtlciB3YXMgb3ZlciB3ZWxrZSBudWNsZW90aWRlIGVyIGFhbndlemlnIHdhcy4gRGUgdmVyd2FjaHRpbmcgaXMgZGF0IGVyIGVlbiB6ZWVyIGxhYWcgcGVyY2VudGFnZSBOJ3MgaW4gZGUgc2VxdWVuY2Ugeml0LCBkZSBzdGFuZGFhcmQgaGllcnZvb3IgaXMgXDwxJS4gYWZ3aWprZW5kZSByZXN1bHRhdGVuIGthbiB3aWp6ZW4gb3AgcHJvYmxlbWVuIHpvYWxzIHNsZWNodGUga3dhbGl0ZWl0IHZhbiBkZSBzZXF1ZW50aWUuIFplIGtvbWVuIHZhYWsgdm9vciBhYW4gaGV0IGJlZ2luIG9mIGVpbmQgdmFuIGRlIHJlYWRzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rDQp8IFNlcXVlbmNlIGxlbmd0aCBkaXN0cmlidXRpb24gfCBEZSBzZXF1ZW5jZSBsZW5ndGggZGlzdHJpYnV0aW9uIGdyYWZpZWsgbGFhdCBkZSB2ZXJkZWxpbmcgdmFuIGRlIGxlbmd0ZXMgdmFuIGRlIHJlYWRzIHppZW4uIFgtYXMgZ2VlZnQgZGUgbGVuZ3RlIHZhbiBkZSBzZXF1ZW50aWVzIChpbiBiYXNlbnBhcmVuKSBlbiBkZSBZLWFzIHRvb250IGFhbnRhbCByZWFkcyB2YW4gZGllIHNwZWNpZmlla2UgbGVuZ3RlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBEZXplIGdyYWZpZWsgaXMgYmVsYW5ncmlqayBiaWogTkdTIG9tZGF0IGFmd2lqa2luZ2VuIGluIGRlIHNlcXVlbnRpZSBsZW5ndGUga3VubmVuIHdpanplbiBvcCBmcmFnbWVudGF0aWUgb2YgdGVjaG5pc2NoZSBmb3V0ZW4gdGlqZGVucyBzZXF1ZW5jZXJpbmcgLiBFZW4gaWRlYWFsIHJlc3VsdGFhdCBpcyBlZW4gc2NoZXJwZSBwaWVrIG9wIDEgc3BlY2lmaWVrZSBsZW5ndGUgd2FubmVlciBqZSAxNTAgYnAgZG9lbHJlYWRsZW5ndGUgaGVidCB6b3UgZGUgbWVlc3RlIHNlcXVlbmNpbmcgb3V0cHV0IG9wIHByZWNpZXMgMTUwIGJwIG1vZXRlbiB2YWxsZW4gd2F0IGVlbiBwaWVrIGJpaiBkaWUgbGVuZ3RlIHpvdSBtb2V0ZW4gb3BsZXZlcmVuLiBBbHMgZXIgbWVlcmRlcmUgcGlla2VuIHppam4gb2YgZWVuIHZyZWRlIHNwcmVpZGluZyB2YW4gbGVuZ3RlcyBrYW4gZGl0IGJldGVrZW4gZGF0IGVyIHNlcXVlbmNpbmcgZm91dGVuLCBzbGVjaHRlIGFkYXB0ZXJ0cmltbWluZyBvZiBkZWdyYWRhdGllIHZhbiBoZXQgRE5BLW1vbnN0ZXIuICAgICAgICAgICAgICAgICAgICAgICB8DQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rDQp8IFNlcXVlbmNlIGR1cGxpY2F0aW9uIGxldmVscyAgfCBEZSBTZXF1ZW5jZSBkdXBsaWNhdGlvbiBsZXZlbHMgZ3JhZmllayBsYWF0IGhldCBwZXJjZW50YWdlIHZhbiBzZXF1ZW5jZXMgemllbiBkaWUgbWVlciBkYW4gMXggdm9vcmtvbWVuLiBEdXBsaWNhdGllcyBrdW5uZW4gdm9vcmtvbWVuIGRvb3IgdGVjaG5pc2NoZSAiYXJ0aWZhY3RzIiB0aWpkZW5zIGRlIHNlcXVlbmNpbmcgZW4gYW5kZXJlIGZhY3RvcmVyZW4gem9hbHMgUENSLWFtcGxpZmljYXRpZSwgZW4ga3VubmVuIGRlIGRpdmVyc2l0aXRlaXQgdmFuIGRlIGRhdGFzZXQgdmVybWluZGVyZW4uIERpdCBoZWVmdCBpbnZsb2VkIG9wIGRvd25zdHJlYW0gYW5hbHlzZXMgem9hbHMgZ2VuZXhwcmVzc2llIG9mIHZhcmlhbnRkZXRlY3RpZS4gfCBIZXQgYWZsZXplbiB2YW4gZGUgZ3JhZmllayBpcyBkb29yIHRlIGtpamtlbiBuYWFyIGRlIHR3ZWUgbGlqbmVuIGluIGRlIGdyYWZpZWsgZGUgRHVwbGljYXRlZCBzZXF1ZW5jZXMgKG1lZXN0YWwgZWVuIHJvZGUgbGlqbikgZ2VlZnQgaGV0IHBlcmNlbnRhZ2UgbWV0IHVuaWVrZSBzZXF1ZW50aWVzIHdlZXIgem9uZGVyIGNvcnJlY3RpZSB2b29yIG5hdHV1cmxpamtlIGR1cGxpY2F0aWVzLiBIZXQgZ2VlZnQgZWVuIGJlZWxkIHZhbiBob2V2ZWVsIHZhbiBkZSByZWFkcyBpbiBkZSBkYXRhc2V0IG1lZXJkZXJlIGtlcmVuIHZvb3Jrb21lbiB6b25kZXIgdGUgZGlmZmVyZW50acOrcmVuIHR1c3NlbiB0ZWNobmlzY2hlIGVuIGJpb2xvZ2lzY2hlIGR1cGxpY2F0ZXMuIGluIGRlIGdyYWZpZWsgd2lsIGplIGdyYWFnIGVlbiBzY2hlcnBlIGRhbGluZyB6aWVuIHdhYXJiaWogZGUgbWVlc3RlIHJlYWRzIGVlbiBkdXBsaWNhdGllIG5pdmVhdSB2YW4gMSBoZWJiZW4gZW4gaGV0IHBlcmNlbnRhZ2UgZ2VkdXBsaWNlZXJlZGUgc2VxdWVudGllcyBkYWFybmEgc25lbCBhZm5lZW10LlwgfA0KfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgRGUgdG90YWwgc2VxdWVuY2VzIGxpam4gKG1lZXN0YWwgZWVuIGJsYXV3ZSBsaWpuKSBjb3JyaWdlZXJ0IHZvb3IgdmVyd2FjaHRlIG5hdHV1cmxpamtlIGR1cGxpY2F0ZXMgZGV6ZSBsYWF0IHppZW4gaG9lIGRlIGR1cGxpY2F0aWUgZXJ1aXQgem91IHppZW4gem9uZGVyIHRlY2huaXNjaGUgYXJ0ZWZhY3RlbiBlbiBiaWVkdCBlZW4gZWVybGlqa2VyIGJlZWxkIHZhbiBob2V2ZWVsIHNlcXVlbnRpZXMgb3ZlcmdlZHVwbGljZWVyZCB6aWpuIGRlIGRlIHNlcXVlbmNlcmluZyB6ZWxmLlwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgWC1hcyBsYWF0IGhldCBhYW50YWwga2VyZW4gemllbiBkYXQgZGUgc3BlY2lmaWVrZSBzZXF1ZW50aWUgd29yZHQgZ2VkdXBsaWNlZXJkXCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgQWxzIGVyIGVlbiBncm9vdCB2ZXJzY2hpbCBpcyB0dXNzZW4gZGUgbGlqbmVuIGJldGVrZW50IGRpdCBkYXQgZXIgZHVwbGljYXRpZSBpcyBvbnN0YWFuIGRvb3IgdGVjaG5pc2NoZSBmYWN0b3JlbiB6b2FscyBQQ1IgZHVwbGljYXRpZSBpbiBwbGFhdHMgdmFuIGJpb2xvZ2lzY2hlIG9vcnphYWsuIFRlIGhvZ2UgYWFudGFsIGR1cG9sYWN0aWUga2FuIHByb2JsZWVtIHppam4gdm9vciBkb3duc3RyZWFtIGFuYWx5c2VzIGVuIGplIHdpbCBkdXMgZGF0IGRlIGxpam5lbiBkaWNodGJpaiBlbGthYXIgbGlnZ2VuLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgWS1hcyBsYWF0IGhldCBwZXJjZW50YWdlIHZhbiByZWFkcyBkYXQgdm9vcmtvbXQgbWV0IGR1cGxpY2F0aWUgbml2ZWF1IHppZW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKw0KfCBPdmVycmVwcmVzZW50ZWQgc2VxdWVuY2VzICAgIHwgRGl0IGlzIGVlbiB0YWJlbCBkaWUgc2VxdWVudGllcyB2YW4gb3AgemlqbiBtaW5zdCAyMGJwIGRpZSB2YWtlciB2b29ya29tZW4gZGFuIDAuMSUgdmFuIGRlIHRvdGFsZSBudW1tZXIgdmFuIHNlcXVlbnRpZXMuIEluIGRlIHRhYmVsIHN0YWF0IGRlIHNlcXVlbnRpZXMgdWl0Z2VzY2hyZXZlbiwgZGUgY291bnQsIGhldCBwZXJjZW50YWdlIGVuIGRlIHdhYXJzY2hpam5saWprZSBicm9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgV2FubmVlciBlciBlZW4gYWJub3JtYWxpdGVpdCB0ZSB6aWVuIHdhcyBpbiBkZSBQZXIgc2VxdWVuY2UgR0MgY29udGVudCBncmFmaWVrIGthbiBlciBpbiBkZXplIHRhYmVsIHdvcmRlbiBnZWtla2VuIG9tIGRlIGJyb24gdGUgdmluZGVuLiBhbHMgaGV0IG5pZXQgc3RhYXQgYWxzIGVlbiBiZWtlbmRlIGFkYXB0ZXIgb2YgInZlY3RvciIsIGthbiBoZXQgaGVscGVuIG9tIGRlIGRhdGEgdGUgYmxhc3RlbiBvIHRlIGlkZW50aXRlaXQgdGUgdmluZGVuIGluIGRlIHRhYmVsLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKw0KfCBBZGFwdGVyIGNvbnRlbnQgICAgICAgICAgICAgIHwgRWVuIGdyYWZpZWsgd2FhciB2ZXJzY2hpbGxlbmRlIGFkYXB0ZXJzIHN0YWFuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgSGV0IGdlZWZ0IGFhbiBvZiBkZSBzZXF1ZW50aWVzIGFkYXB0ZXJmcmFnbWVudGVuIGJldmF0dGVuIGVuIHZhbiB2ZXJzY2hpbGxlbmRlIGFwcGFyYXRlbi4gYWxzIGRlemUgYWFud2V6aWcgemlqbiBpcyBoZXQgdGUgemllbiBkb29yIGFmIHRlIGxlemVuIGluIGRlIGdyYWZpZWsgd2Vsa2UgcG9zaXRpZSBlciB6aWpuIG9tIHplIHZlcnZvbGdlbnMgd2VnIHRlIHRyaW1tZW4uIGRlemUgImFkYXB0ZXJjb250ZW50IiBpcyBlciB2b29yIGlkZW50aWZpY2F0aWUgdmFuIGRlIEROQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKw0KDQo6IFRhYmxlIC0gMQ0KDQoqKkdlYnJ1aWt0ZSBicm9ubmVuIHZvb3IgdWl0bGVnKioNCg0KQEZhc3RRQ01hbnVhbA0KDQpAS2hldGFuaTIwMTgNCg0KVWl0IG9uemUgZmFzdFFDIHJlc3VsdGF0ZW4ga3dhbWVuIHdhdCBiaWp6b25kZXJlIHJlc3VsdGF0ZW4uIEVyIHdhcmVuIHJlYWRzIHZhbiB2ZXJzY2hpbGxlbmRlIGxlbmd0ZW4gZGUgZ3Jvb3RzdGUgd2FzIDMwMCBiYXNlIHBhcmVuIHdhdCBib3ZlbiBkZSBhbGdlbWVuZSBub3JtIGlzLg0KDQpbIVtGaWd1dXIgMTogRmFzdFFDIGJhc2Ugc2VxdWVuY2UgcXVhbGl0eSBncmFmaWVrXShpbWFnZXMvY2xpcGJvYXJkLTI4ODA4NjI2NS5wbmcpXShodHRwczovL2hiY3RyYWluaW5nLmdpdGh1Yi5pby9JbnRyby10by1ybmFzZXEtaHBjLXNhbG1vbi9pbWcvRmFzdFFDX3NlcV9xdWFsLnBuZykNCg0KWyFbRmlndXVyIDI6IFBlciBiYXNlIHNlcXVlbmNlIGNvbnRlbnRdKGltYWdlcy9jbGlwYm9hcmQtMzA4MzUzMDczLnBuZyldKGh0dHBzOi8vaGJjdHJhaW5pbmcuZ2l0aHViLmlvL0ludHJvLXRvLXJuYXNlcS1ocGMtc2FsbW9uL2ltZy9mYXN0cWNfcGVyX2Jhc2Vfc2VxdWVuY2VfY29udGVudC5wbmcpDQoNCkRlIGNvbmNsdXNpZSB1aXQgZGUgYW5hbHlzZSB2YW4gZGUgRmFzdFFDIHJlc3VsdGF0ZW4gaXMsIERhdCBkZSBnZW5lcmFsZSBzdGF0aXN0aWVrZW4gNyB2YW4gZGUgYmVzdGFuZGVuIGVub3JtIHZlZWwgZHVwbGljYXRlcyB3YXQgZWVuIHJlZGVsaWprIHByb2JsZWVtIHZvcm10LiBXYXQgb29rIG9wdmFsdCBpcyBkYXQgYWxsZSBiZXN0YW5kZW4gbWV0IGhvZ2UgZHVwbGljYXRlcyBlZW4gZ2VtIHJlYWQgbGVuZ3RlIHZhbiAyNTAgYnAgd2F0IG9wbWVya2VsaWprIGxhbmcgaXMgKyBkZSByZXN1bHRhdGVuIG1ldCBlbmlnc3ppbnMgZ29lZGUga3dhbGl0ZWl0IGhlYmJlbiBlZW4gZ2VtIGxlbmd0ZSB2YW4gMTUwIGJwLiBWZXJkZXIgYWxsZSBiZXN0YW5kZW4gbWV0IHZlZWwgZHVwbGljYXRlcyBiZXZhdHRlbiB2ZWVsIG1pbmRlciByZWFkcyBkYW4gZGUgYmVzdGFuZGVuIHpvbmRlciBvZiBtZXQgd2VpbmlnIGR1cGxpY2F0ZXMuIEFsbGUgYmVzdGFuZGVuIG1ldCAyNTAgYnAgbGVuZ3RlIGVpbmRpZ2VuIGFhbiBoZXQgZWluZCBpbiBoZXQgcm9kZSB2bGFrIGluIGRlIHNlcXVlbnRpZSBrd2FsaXRlaXQgZW4gZXIgaXMgZWVuIGRpcCBiaWogZGUgMTEwLTEyMCB3YWFybmEgYWxsZXMgZHVzIGFmemFrdCwgdm9vciBkZSBzZXF1ZW50aWVzIG1ldCAyNTBicCBpcyBkZSBrd2FsaXRlaXQgZ29lZCB2YW4gMC0xMTAgYnAuIERlIHNlcXVlbmNlIGR1cGxpY2F0aW9uIGxldmVscyB6aWpuIG9vayBvcG1lcmtlbGlqayBkb29yIHZlZWwgcGlla2VuIGVuIGVlbiBob29nIGJlZ2luIHZhbiBkZSBsaWpuLiBPdmVycmVwcmVzZW50ZWQgc2VxdWVuY2VzIHZhbGxlbiBvb2sgb3Agd2FudCB3ZWVyIGRlIDI1MGJwIGJlc3RhbmRlbiBoZWJiZW4gZXJnIHZlZWwgZHVwbGljYXRlcyB3YWFyIHZhbiBzb21taWdlIGluIGRlIDUwJSB6aXR0ZW4uIEVyIHppdCBvb2sgaGVlbCB2ZWVsIGFkYXB0ZXIgY29udGVudCBiaWogMiBmaWxlcyBpcyBoZXQgemVsZnMgXD41MCUuIEtvcnRvbSBkZXplIGZpbGVzIG1vZXRlbiBnZXRyaW1tZWQgb2YgdmVyd2lqZGVyZCB3b3JkZW4uDQoNCkRlemUgY29kZSBrb210IHVpdCBoZXQgbG9nYm9layB2YW4gSXZhcg0KDQpgYGB7YmFzaCwgZXZhbD1GQUxTRX0NCg0KI0hpZXIgd29yZHQgZGUgd29ya2luZyBkaXJlY3RvcnkgZ2V6ZXQsIGRpdCB3b3JkdCBnZWRhYW4gbWV0IHNldHdkDQpzZXR3ZCgiL3N0dWRlbnRzLzIwMjQtMjAyNS9UaGVtYTA1LzNkY29uZm9ybWF0aWVDaHJvbWF0aW5lL2Zhc3RxIikNCih4ID0gZ2V0d2QoKSkNCiNIaWVyIHdvcmR0IGZhc3RxYyB1aXRnZXZvZXJkIG9wIGZxLmRpciA9IHgsIHggaXMgZGUgZWVyZGVyIGdlemV0dGUgd2QuIA0KZmFzdHFjKGZxLmRpciA9IHgsIHFjLmRpciA9ICIvc3R1ZGVudHMvMjAyNC0yMDI1L1RoZW1hMDUvM2Rjb25mb3JtYXRpZUNocm9tYXRpbmUvZmFzdHFjX291dHB1dC8iLCBmYXN0cWMucGF0aCA9ICIvdXNyL2Jpbi9mYXN0cWMiLCB0aHJlYWRzID0gMTAwKQ0KI29vayB3b3JkdCBkZSBvdXRwdXQgZ2V6ZXQgdmlhIGhldCBxYy5kaXIgY29tbWFuZG8sIHdhYXIgZmFzdHFjIHN0YWF0IHdvcmQgb29rIGFhbmdlZ2V2ZW4gbWV0IGZhc3RxYy5wYXRoLiBBbHMgbGFhdHN0ZSB3b3JkIGRlIHRocmVhZHMgY29tbWFuZCBnZWJydWlrdCBvbSBhYW4gdGUgZ2V2ZW4gaG9ldmVlbCB0aHJlYWRzIGdlYnJ1aWt0IG1vZ2VuIHdvcmRlbi4NCg0KYGBgDQoNCkhpZXIgaXMgZGUgY29kZSB2b29yIG11bHRpcWMgLSBnZXNjaHJldmVuIGRvb3IgSXZhciAmIFN0b3JtDQoNCmBgYHtiYXNoLCBldmFsPUZBTFNFfQ0KI2hpZXIgc3RhYXQgcHJpbnQgd29ya2luZyBkaXJlY3RvcnkNCnB3ZA0KIyBoaWVyIHdvcmR0IG1ldCBjZC4uLyBnZXpvcmd0IGRhdCBiYXNoIDEgZGlyZWN0b3J5IHRlcnVnIGdhYXQNCmNkIC4uLw0KIyBkZXplIGNkIGxpamQgYmFzaCBuYWFyIGZhc3RxY19vdXRwdXQNCmNkIGZhc3RxY19vdXRwdXQNCiMgaGllciB3b3JkdCBkZSB3b3JraW5nIGRpcmVjdG9yeSB3ZWVyIGdlcHJpbnQNCnB3ZA0KIyBoaWVyIHdvcmR0IG11bHRpcWMgdWl0Z2V2b2VyZCBvcCBhbGxlIGJlc3RhbmRlbiBpbiBkZSBmYXN0cWNfb3V0cHV0DQptdWx0aXFjIC4NCmBgYA0KDQpNdWx0aVFDIHdvcmR0IGhpZXIgZ2VicnVpa3Qgb20gbmFhciBhbGxlIGZhc3RxYyBvdXRwdXQgZmlsZXMgdGUga2lqa2VuLiBNdWx0aXFjIHpvZWt0IGVlbiBkaXJlY3Rvcnkgdm9vciBGYXN0UUMgb3V0cHV0IGVuIGNvbXBpbGVlcnQgZGV6ZSBmaWxlcyB6b2RhdCBkZSBhbGdlbWVuZSByZXN1bHRhdGVuIG92ZXIgbWVlcmRlcmUgZmlsZXMgYmV0ZXIgdGUgYmVncmlqcGVuIGlzLg0KDQohW0ZpZ3V1dXIgMzogUnV3ZSBkYXRhIGluIG11bHRpUUNdKGltYWdlcy9tdWx0aXFjX3J1d19zZXFfcXVhbGl0eS5QTkcpDQoNCkhpZXIgaXMgTXVsdGlRQyB0ZSB6aWVuLCBoZXQgb3ZlcmxhcHQgYWxsZSBncmFmaWVrZW4gZW4gbWFha3QgaGllciAxIGdyb3RlIGdyYWZpZWsgdmFuIHdhYXIgd2FubmVlciBkZXplIHdvcmR0IGFhbmdla2xpa3QgaGV0IGFsbGVtYWFsIGRpbmdlbiBsYWF0IHppZW4uIERlemUgZGluZ2VuIHppam4gZGUgbmFhbSB2YW4gZGUgc2FtcGxlLCB3ZWxrZSBiYXNlIHBvc2l0aWUgaGV0IGlzIGVuIGRlIGt3YWxpdGVpdC4gMSBkaW5nIHdhdCBvb2sgbm9nIGFuZGVycyBpcywgaXMgZGUgc2NvcmUgbmFhc3QgZGUgdGl0ZWwuIERlIHNjb3JlIG5hYXN0IGRlIHRpdGVsIGxhYXQgemllbiBkYXQgOCBzYW1wbGVzIHdlbCBlZW4gZ29lZGUga3dhbGl0ZWl0IGhlYmJlbiBlbiA3IG5pZXQuDQoNCioqT29rIHppam4gZGUgdm9sZ2VuZGUgc2FtcGxlcyB6aWpuIG5pZXQgZ2VicnVpa3Q6KipcDQpCMjIwK0NENDMrSWdNLSBzb3J0ZWQgcHJpbWFyeSBwcm8tQiBjZWxscy5cDQpEZXplIHNhbXBsZXMgemlqbiB2ZXJrcmVnZW4gbWV0IGVlbiBJbGx1bWluYSBNaVNlcS4NCg0KU1JSMjY5ODA1MjdcDQpTUlIyNjk4MDUyOFwNClNSUjI2OTgwNTI5XA0KU1JSMjY5ODA1MzANCg0KRGUgcmVkZW4gaGllcnZvb3IgaXMgZGF0IGhldCBzYW1wbGVzIHZhbiBXVCBtdWl6ZW4gemlqbiwgaGllciBnYWFuIHdlIGhldCByZWZlcmVudGllZ2Vub29tIHZvb3IgZ2VicnVpa2VuLg0KDQpPb2sgd2FzIGRlIGt3YWxpdGVpdCB2YW4gZGV6ZSBzZXF1ZW50aWVzIHZvbGdlbnMgZmFzdHFjIHZlZWwgc2xlY2h0ZXIgZGFuIGRpZSB2YW4gZGUgb25kZXJzdGFhbmRlIHNhbXBsZXMuIE1vZ2VsaWprIGtvbXQgZGl0IG9tZGF0IGRlIHJlYWRzIHRlIGxhbmcgd2FyZW4gZW4gZGUga3dhbGl0ZWl0IGRhYXJkb29yIHRlIHNuZWwgbmFhciBiZW5lZGVuIGdpbmcuDQoNCioqRGUgdm9sZ2VuZGUgemlqbiB3ZWwgZ2VicnVpa3Q6KipcDQpQcmltYXJ5IHByby1CIGNlbGxzIGJ5IENEMTkrIHNlbGVjdGlvbiAoUmFnMi0vLSkgRGV6ZSBzYW1wbGVzIHppam4gdmVya3JlZ2VuIG1ldCBlZW4gSWxsdW1pbmEgTm92YVNlcSA2MDAwLiBTUlIyNjk4MDU0OVwNClNSUjI2OTgwNTUwXA0KU1JSMjY5ODA1NTFcDQpTUlIyNjk4MDU1Mg0KDQpEZSBvbm5vZGlnZSBzYW1wbGVzIHppam4gb29rIHZlcndpamRlcmQgdWl0IGRlIGxpanN0IChTcmFBY2NMaXN0LmNzdikgb21kYXQgZGV6ZSBtZXQgZGUgcGlwZSBvcGVyYXRvciBhYW4gZGUgcGFyYWxsZWwgb3BkcmFjaHQgZ2VnZXZlbiB3b3JkdC4gQWxzIGRlIG5hbWVuIGluIGRlIGFjY2Vzc2lvbiBsaWpzdC4NCg0KT20gZWVuIGdlaGVsZSBhbmFseXNlIHRlIHppZW4gdmFuIGRlIEZhc3RRQyByZXN1bHRhdGVuIG1vZXQgZXIgZ2VrZWtlbiB3b3JkZW4gbmFhciBkZSBsb2dib2VrZW4gdmFuIFN0b3JtIGVuIEl2YXINCg0KIyMjIFRlc3QgZGF0YSBtYWtlbg0KDQoqKlNlcWtpdCAtKiogSXMgZWVuIHZlZWx6aWpkaWdlIHRvb2wgdm9vciBoZXQgdmVyd2Vya2VuIGVuIGFuYWx5c2VyZW4gdmFuIHNlcXVlbnRpZWJlc3RhbmRlbiBkZSBpbnB1dHMgd2Vsa2UgaGlqIGFjY2VwdGVlcnQgemlqbiBGQVNUQSBlbiBGQVNUUS4gSGV0IGthbiBncm90ZSBkYXRhc2V0cyBlZmZpY2nDq250IGRvb3Jsb3BlbiBlbiBiaWVkdCBtZWVyZGVyZSBmdW5jdGllcyB6b2FscyBmaWx0ZXJpbmcsIHNwbGl0c2VuIHZhbiBzZXF1ZW50aWVzLCBzdGF0aXN0aWVrZW4gZ2VuZXJlcmVuLCB0ZXN0IGRhdGEgc2V0cyBtYWtlbiBldGMuIERlIGdlYnJ1aWt0ZSB2ZXJzaWUgb3AgZGUgYmlvIGluZiBhc3NlbWJsaXggc2VydmVyICh3YWFyIGRlIFJzdHVkaW8gY29tbWFuZHMgb3AgZ2VydW5kIHdvcmRlbikgaXMgb3AgZGl0IG1vbWVudCBzZXFraXQgVjIuMy4wDQoNCioqVGVzdGRhdGEgLSoqIFRlc3QgZGF0YSBpcyBlZW4gZXNzZW50aWVlbCBkZWVsIHZhbiBlZW4gb25kZXJ6b2VrIGRpdCBpcyBvbSB2ZXJzY2hpbGxlbmRlIHJlZGVuZW4sIHRlc3QgZGF0YSBrYW4gaGVscGVuIG9tIHRvb2xzIHRlIHZhbGlkZXJlbi4gQWxzIGRlIHRlc3QgZGF0YSBkZXplbGZkZSByZXN1bHRhdGVuIGdlZWZ0IGFscyBkZSB0d2VlIG9mIG1lZXIgZWNodGUgZGF0YSBzZXRzIGRhbiBrYW4gZGl0IGFhbmdldmVuIGRhdCBkZSB0b29sIG5pZXQgZ29lZCB3ZXJrdC4gVGVzdGRhdGEga2FuIG9vayB3b3JkZW4gZ2VicnVpa3Qgb20gZGUgY29kZSBpbiBkZSBiYXNoc2NyaXB0cyBwcm9lZiB0ZSBydW5uZW4sIGRpdCBvbWRhdCBuaWV0IGFsdGlqZCBhbGxlcyBnb2VkIGdhYXQgbWV0IGRlIGNvbW1hbmRvJ3MgZW4gaW5wbGFhdHMgdmFuIGRlIGVjaHRlIGRhdGEgdGUgYmVzY2hhZGlnZW4ga2FuIGRpdCBiZXRlciBtZXQgdGVzdCBkYXRhLg0KDQpEaXQgaXMgZHVzIG9vayBkZSByZWRlbiBkYXQgd2lqIHRlc3QgZGF0YSBoZWJiZW4gZ2VtYWFrdCBvbSB0ZSBraWprZW4gb2YgZGUgcmVzdWx0YXRlbiB2ZXJzY2hpbGxlbiBtZXQgZGUgdGVzdCBkYXRhIG9mIGRhdCBkZXplIGhldHplbGZkZSB6aWpuIG1ldCBvbnplIGVjaHRlIGRhdGEuDQoNCkRlIHZvbGdlbmRlIGNvZGUgaXMgZ2VicnVpa3QgaGllcnZvb3INCg0KRGV6ZSBjb2RlIGlzIGdlc2NocmV2ZW4gZG9vciBGbG9yaXMsIGlrIGhlYiBvcCBkZSBiaW4gcGMgZWNodGVyIG9vayBvbSBoZXQgemVsZiB0ZSBvZWZlbmVuIG9vayBlZW4gdGVzdC1kYXRhIHNldCBnZW1hYWt0LiBhbGxlIGNvZGUgaXMgaGllcm9uZGVyIHRlIHppZW4uDQoNCmBgYHtiYXNoLCBldmFsPUZBTFNFfQ0KDQpjZCAvcnVuL21lZGlhL2Zsb3Jpcy9GTE9SSVNfMy9EQVRBX1NFVFMvM0RfQ2hyb21hdGluZV9Db25mb3JtYXRpZS9ETkEvU1JBDQoNCnNlcWtpdCBoZWFkIC1uIDEwMDAwIFNSUjI2OTgwNTI3XzEuZmFzdHEgPiBzdWJzZXRfU1JSMjY5ODA1MjdfMS5mYXN0cQ0Kc2Vxa2l0IGhlYWQgLW4gMTAwMDAgU1JSMjY5ODA1MjdfMi5mYXN0cSA+IHN1YnNldF9TUlIyNjk4MDUyN18yLmZhc3RxDQoNCiNDb2RlIHZvb3Igb3AgZGUgYmluIFBDDQpjZCAvc3R1ZGVudHMvMjAyNC0yMDI1L1RoZW1hMDUvM0RfQ2hyb21hdGluZV9Db25mb3JtYXRpZS9ETkEvU1JBDQoNCiMgRWVyc3QgaGViYmVuIHdlIGdlcHJvYmVlcmQgb20gInNhbXBsZSIgdGUgZ2VicnVpa2VuIGluIHBsYWF0cyB2YW4gaGVhZA0Kc2Vxa2l0IHNhbXBsZSAtcCBTUlIyNjk4MDUyN18xLmZhc3RxID4gc3Vic2V0X1NSUjI2OTgwNTI3XzEuZmFzdHENCg0KIyBEaXQgd2Vya3RlIGVjaHRlciBuaWV0IGhlZWwgZ29lZCBkdXMgaGViYmVuIHdlIHVpdGVpbmRlbGlqayBoZWFkIGdldm9uZGVuIGVuIGdlYnJ1aWt0DQoNCnNlcWtpdCBoZWFkIC1uIDEwMDAwIFNSUjI2OTgwNTI3XzEuZmFzdHEgPiBzdWJzZXRfU1JSMjY5ODA1MjdfMS5mYXN0cQ0KDQoNCmBgYA0KDQpTZXFraXQgaXMgaGV0IGFhbnJvZXBlbiB2YW4gaGV0IHByb2dyYW1tYSB3YXQgZGUgdGVzdGRhdGEgbWFha3QsIGRlIHJlZGVuIG9tIHNlcWtpdCB0ZSBnZWJydWlrZW4gaXMgb21kYXQgaGV0IGVlbiBzdXBlciBzbmVsIHByb2dyYW1tYSBpcy4gU25lbGxlciBkYW4gZWVuIHByb2dyYW1tYSB6b2FscyBwaWd6IHdhdCBtdWx0aS10aHJlYWRlZCBpcy4NCg0KaGVhZCBzZWxlY3RlZXJ0IGhldCBkZWVsIHZhbiBkZSBvcmlnaW5lbGUgZGF0YSB3YWFyb3AgZGUgdGVzdC1kYXRhIG1vZXQgd29yZGVuIGdlYmFzZWVyZCwgaGV0IGdlYnJ1aWtlbiB2YW4gaGVhZCBpbnBsYWF0cyB2YW4gc2FtcGxlIGlzIHZvb3IgcmVwbGljZWVyYmFhcmhlaWQgZW4gcmVwcm9kdWN0aWUgb21kYXQgaGV0IGhlZWwgZXJnIGxpamt0IG9wIGRlIG9yaWdpbmVsZSBkYXRhLg0KDQotbiBnZWVmdCBkZSBsZW5ndGUgYWFuIHZhbiBob2V2ZWVsIHJlYWRzIGluIGRlIHRlc3QgZGF0YSBtb2V0IHppdHRlbi4NCg0KIyMjIEFjaHRlcmdyb25kIEluZm8gdmVyemFtZWxpbmcNCg0KRGUgcmVkZW4gb20gYWNodGVyZ3JvbmQgaW5mb3JtYXRpZSB0ZSB2ZXJ6YW1lbGVuIGlzIG9tIGhldCBvbmRlcnpvZWsgYmV0ZXIgdGUga3VubmVuIHVpdGxlZ2dlbi4gSGV0IHJlZmVyZW50aWUgb25kZXJ6b2VrIGdhYXQgb3ZlciB2ZXJzY2hpbGxlbmRlIGRpbmdlbiBkaWUgbmlldCB2YWFrIHdvcmRlbiBiZWhhbmRlbGQuIDIgdmFuIGRpZSBkaW5nZW4gemlqbiBkZSBBL0IgY29tcGFydGltZW50ZW4uIERlemUgaGViYmVuIGludmxvZWQgb3AgZGUgYWN0aXZhdGllIHZhbiBoZXQgZ2Vub29vbS4gUHJvLWIgY2VsbGVuIHppam4gb29rIGVlbiBiZWxhbmdyaWprIG9uZGVyd2VycCBpbiBoZXQgcmVmZXJlbnRpZSBvbmRlcnpvZWsgZW4gemUgemlqbiBvb2sgYmVsYW5ncmlqayB2b29yIG9ucyBvbmRlcnpvZWssIGRpdCBpcyBvbWRhdCB3aWoga2lqa2VuIG5hYXIgZGUgRUJGMSB3YW50IGRlIFByby1CIGNlbGxlbiBoZWJiZW4gZGl0IG5vZGlnIG9tIHRlIGRpZmZlcmVudGnDq3JlbiB2YW4gaGVtYXRvcG9ldGlzY2hlIHN0YW1jZWxsZW4gbmFhciB2b2x3YXNzZW4gQiBjZWxsZW4uIFdhbm5lZXIgZGl0IGdlbiBkdXMgbWluZGVyIHZvb3Jrb210IChvb2sgd2VsIHRvdCBleHByZXNzaWUga29tdCkga3VubmVuIGRlIEIgY2VsbGVuIHZhbiBkZSB2b29ybG9wZXIgQiBjZWxsZW4gaGViYmVuLg0KDQoqKkEvQiBjb21wYXJ0aW1lbnRlbioqDQoNCkBIYXJyaXMyMDIzXA0KQE9qaTIwMjQNCg0KRGUgbnVjbGV1cyB2YW4gaGV0IGh1bWFuZSBnZW5vb20gaXMgdmVyZGVlbGQgaW4gdmVyc2NoaWxsZW5kZSBydWltdGVsaWprZSBjb21wYXJ0aW1lbnRlbi4gQWN0aWVmIGNocm9tYXRpbmUgYmV2aW5kdCB6aWNoIGRvb3JnYWFucyBpbiBoZXQgQS1jb21wYXJ0aW1lbnQsIHRlcndpamwgaW5hY3RpZWYgY2hyb21hdGluZSBlZXJkZXIgZ2Vhc3NvY2llZXJkIGlzIG1ldCBoZXQgQi1jb21wYXJ0aW1lbnQuIERlemUgY29tcGFydGltZW50YWxpc2F0aWUgaXMgZ2XDr2RlbnRpZmljZWVyZCBtZXQgYmVodWxwIHZhbiBkZSBIaS1DLW1ldGhvZGUsIGVlbiB0ZWNobmllayBkaWUgZGUgY2hyb21vc29tYWxlIG9yZ2FuaXNhdGllIGluIGthYXJ0IGJyZW5ndCBkb29yIG9wIG5hYmlqaGVpZCBnZWJhc2VlcmRlIGludGVyYWN0aWVzIHRlIGNvbWJpbmVyZW4gbWV0IGhvZ2Vkb29ydm9lciBzZXF1ZW5jaW5nLiBIZXQgYmVsYW5nIHZhbiBkZSBBLSBlbiBCLWNvbXBhcnRpbWVudGVuIGluIG9ucyBvbmRlcnpvZWsgbGlndCBpbiBoZXQgZmVpdCBkYXQgKkViZjEqIChFYXJseSBCLUNlbGwgRmFjdG9yIDEpLCBlZW4gY3J1Y2lhbGUgZmFjdG9yIHZvb3IgcHJvLUItY2VsbGVuLCB2YW4gcG9zaXRpZSB2ZXJhbmRlcnQgdHVzc2VuIGRlemUgY29tcGFydGltZW50ZW4gbmFhcm1hdGUgaGV0IG9yZ2FuaXNtZSAoZGUgbXVpcykgb3VkZXIgd29yZHQuDQoNCkhldCBBIGNvbXBhcnRpbWVudCBpcyBkdXMgaGV0IGNvbXBhcnRpbWVudCB3YWFyIGRlIGV4cHJlc3NpZSBhY3RpZWYgaXMgZW4gaG9nZSBnZW4gdHJhbnNjcmlwdGllIHBsYWF0cyB2aW5kdC4gVm9vciB6byB2ZXIgd2lqIHdldGVuIGxpZ3QgaGV0IEEgY29tcGFydGltZW50IGRpY2h0IGJpaiBoZXQgY2VudHJ1bSBlY2h0ZXIgaXMgZGl0IG5vZyB3ZWwgc3BlY3VsYXRpZS4gR2VuIHJpamssIGhvZ2UgR0MtY29udGVudCwgaGViYmVuIGhpc3RvbmUgbWFya2VyaW5nZW4gdm9vciBhY3RpZXZlIHRyYW5zY3JpcHRpZS4NCg0KSGV0IEIgY29tcGFydGltZW50IGlzIGRlIHBsZWsgd2FhciBkZSBleHByZXNzaWUgbm9uIGFjdGllZiBpcyBvb2sgd2VsICJzaWxlbmNlZCIsIGluIGhldCBCIGNvbXBhcnRpbWVudGVuIHppdHRlbiBuaWV0IHZlZWwgZ2VuZW4sIGNvbXBhY3QsIGhlYmJlbiBoaXN0b25lIG1hcmtlcmluZ2VuIHZvb3Igc2lsZW5jaW5nIGVuIGJlc3RhYW4gaGV0IG1lZXN0ZSB1aXQgTEFEcyBlbiBiZXZhdHRlbiBsYXRlIHJlcGxpY2F0aW9uIG9yaWdpbnMuDQoNClRBRHMgLSBFciB3b3JkdCBnZXN1Z2VyZWVyZCBkYXQgZGV6ZSBlZW4gZ3JvdGUgaW52bG9lZCBoZWJiZW4gb3AgZ2VuIHJlZ3VsYXRpZSBlbiBkYXQgemUgYmVsYW5ncmlqayB6aWpuIHZvb3IgZW1icnlvbmFhbCBvbnR3aWtrZWxpbmcuIE9vayB3ZXJkIGdlemllbiBkYXQgbGFuZ2UgYWZzdGFuZCByZWd1bGF0aWUgdmFuIGdlbiBleHByZXNzaWUgbmlldCBhbGxlbiBsZXVudCBvcCBUQURzIGVuIGh1biBncmVuemVuLg0KDQpTdWIgY29tcGFydGltZW50ZW4gLSBFciB3b3JkdCBnZXN1Z2dlcmVlcmQgZGF0IGVyIGJpbm5lbiBkZSB0d2VlIGNvbXBhcnRpbWVudGVuIG5vZyBrbGVpbmVyZSBzdWJjb21wYXJ0aW1lbnRlbiB6aXR0ZW4uIEVsayBjb21wYXJ0aW1lbnQgd2VyZCBnZW9ic2VydmVlcmQgbWV0IHZlcnNjaGlsbGVuZCBoaXN0b25lIG1vZGlmaWNhdGllIHBhdHJvbmVuIGVuIFJULiB3YXQgc3VnZ2VyZWVydCBkYXQgZWxrZSBjaHJvbWF0aW5lIG1ldCBnZWxpamtlIGthcmFrdGVyaXN0aWVrZW4gaW4gZWxrYWFyIHdvcmR0IGdlemV0IG9tIHZlcnNjaGlsbGVuZGUgaW50ZXJhY3RpZSBlZW5oZWRlbiBiaW5uZW4gZGUgQSBlbiBCIGNvbXBhcnRpbWVudGVuLiBFciBpcyBvcCBoZXQgbW9tZW50IG5vZyBuaWV0IGdldm9uZGVuIG9mIGVyIGVlbiBsaW5rIHR1c3NlbiBkZSBzdWJjb21wYXJ0aW1lbnRlbiBsaWd0IGVuIGhldCBmZWl0ZWxpamtlIG51Y2xlYXJlIG9yacOrbnRhdGllcHVudGVuLg0KDQoqKlBybyBCLWNlbGwqKg0KDQpQcm8tQiBjZWxsZW4gb250c3RhYW4gaW4gaGV0IGJlZW5tZXJnIHZhbiBwcm9nZW5pdG9yIGNlbGxlbiBuYWFyIGRlIEItY2VsbCBsaW5lYWdlLiBlbGtlIHByby1CIGNlbGwgb25kZXJnYWF0IG9uYWZoYW5rZWxpamtlIGhlcm9yZGVuaW5nIGVuIG9wIGJvdXdpbmcgdmFuIGRpdmVyc2UgdmFyaWFiZWxlbiwgZGl2ZXJzaXRlaXQgZW4gImpvaW5pbmciIGdlbiBzZWdtZW50ZW4gdmFuIGRlIGltbXVub2dsb2J1bGluZSB6d2FyZSAoSCktIGtldGVuIGxvY3VzLg0KDQpLcml0aXNjaCB2b29yIGRlIGdlbmVyYXRpZSB2YW4gaGV0IHZlcnNjaGlsbGVuZCByZXBlcnRvaXJlIHZhbiBiIGNlbGxlbiBjYXBhYmVsIGluIGhldCBoZXJrZW5uZW4gdmFuIGVlbiB3aWpkZSB2YXJpYSBhYW4gcGF0aG9nZW5lLiBEZSBwcm8tQiBjZWxsIHZlcmFuZGVyZCBuYWFyIGRlIHByZS1CIGNlbGwgZGl0IGdlYmV1cmQgd2FubmVlciBkZSB6d2FyZSBpbW11bm9nbG9idWxpbmUga2V0ZW4gaGVyIGdlb3JnYW5pc2VlcmQgaXMuDQoNCkBOZW1hemVlMjAxNw0KDQojIyMgSW5kZXhlcmVuIHJlZmVyZW50aWUgZ2Vub29tDQoNCk1ldCBhbGxlZW4gZWVuIGZhc3RxIGJlc3RhbmQgaXMgaGV0IG5pZXQgZHVpZGVsaWprIHdhYXIgaW4gaGV0IGdlbm9vbSB2YW4gZGUgbW0zOSBtdWlzIGRlemUgcmVhZHMgdmFuZGFhbiBrb21lbi4gT20gaGllciBhY2h0ZXIgdGUga29tZW4gbW9ldCByZWFkIG1hcHBpbmcgd29yZGVuIGdlYnJ1aWt0LCBIaWVyIHdvcmRlbiBkZSByZWFkcyBvb2sgd2VsIGRhdGEtc2VxdWVudGllcyB2ZXJnZWxla2VuIG1ldCBlZW4gYmVrZW5kIGdlbm9vbS4gSGV0IGdlbm9vbSBpbiBvbnMgcmVmZXJlbnRpZSBvbmRlcnpvZWsga3dhbSB1aXQgMjAxMiBoZXQgR1JDbTM4IGVuIGRpdCBvbmRlcnpvZWsga2lqa3QgbmFhciBHUkNtMzkgd2FhcmRvb3IgZXIgZHVzIHZlcnNjaGlsbGVuIGt1bm5lbiB6aWpuIGluIGRlIHZhcmlhbnRlbg0KDQpIaWVyIHdvcmR0IG9ucyBnZWtvemVuIHJlZmVyZW50aWUgZ2Vub29tIGdlIGluZGV4ZWVydC4gRGUgcmVkZW4gdm9vciBoZXQgYWxpZ25lbiB2YW4gaGV0IHJlZmVyZW50aWUgZ2Vub29tIGlzIHZvb3IgaGV0IGdlYnJ1aWsgdmFuIEJXQS1tZW0yLiBlZW4gZ2XDr25kZXhlZXJkZSB2ZXJzaWUgdmFuIGhldCByZWZlbnRpZWdlbm9vbSBtb2V0IGR1cyBnZW1hYWt0IHdvcmRlbiwgZGl0IGthbiBtZXQgYndhLW1lbTIgaW5kZXguIGluZGV4ZXJlbiBtYWFrdCBoZXQgYWxpZ24gcHJvY2VzIHZlZWwgc25lbGxlci4gRGUgc2FtcGxlcyBTUlIyNjk4MDUyOF8xIGVuIFxfMiB6aWpuIGdlYnJ1aWt0IG5hIGhldCByZWZlcmVudGllZ2Vub29tIHRlIGluZGV4ZXJlbiBtZXQgQldBX01FTTIuIEhldCBnZWJydWlrdGUgcmVmZXJlbnRpZSBnZW5vb20gaXMgbW0zOSAoR0NGXzAwMDAwMTYzNS4yNykuDQoNCkluIGRlIG9uZGVyc3RhYW5kZSBjb2RlIGNodW5rIHdvcmR0IGhldCBnZcOvbmRleGVlcmRlIG11aXNnZW5vb20gInRlc3RuYWFtIiBnZW5vZW1kLiBEYWFybmEgd29yZGVuIHR3ZWUgc2FtcGxlcyAoZm9yd2FyZCByZWFkIGVuIHJldmVyc2UgcmVhZCkgZ2UtYWxpZ25lZCBtZXQgaGV0IHpvanVpc3QgdmVya3JlZ2VuIGdlw69uZGV4ZWVyZGUgcmVmZXJlbnRpZWdlbm9vbS4NCg0KRA0KDQoqKldhdCBoaWVyIHVpdCBrb210IGlzIGVlbiBTQU0gZmlsZSBkZXplIHppZXQgZXIgYWxzIHZvbGd0IHVpdDpcDQoqKlwNClxASEQgVk46MS42IFNPOmNvb3JkaW5hdGUgLSBEZSBoZWFkZXIgbWV0IGRlIHNwZWNpZmlla2UgdmVyc2llIHZhbiBoZXQgU0FNIGZvcm1hdCAxLjYgZHVzIFxAU1EgU046cmVmIExOOjQ1IC0gTm9nIGVlbiBoZWFkZXIgbWV0IGRlIFNOIG9vayB3ZWwgc2VxdWVudGllIG5hYW0gZW4gZGUgTE4gb29rIHdlbCBsZW5ndGhlICoqKkhpZXIgb25kZXIgemlqbiBkZSBhbGlnbm1lbnQgcmVjb3JkcyB0ZSB6aWVuKioqXA0KcjAwMSA5OSByZWYgNyAzMCA4TTJJNE0xRDNNID0gMzcgMzkgVFRBR0FUQUFBR0dBVEFDVEcgXCogcjAwMiAwIHJlZiA5IDMwIDNTNk0xUDFJNE0gXCogMCAwIEFBQUFHQVRBQUdHQVRBIFwqIHIwMDMgMCByZWYgOSAzMCA1UzZNIFwqIDAgMCBHQ0NUQUFHQ1RBQSBcKiBTQTpaOnJlZiwyOSwtLDZINU0sMTcsMDsgcjAwNCAwIHJlZiAxNiAzMCA2TTE0TjVNIFwqIDAgMCBBVEFHQ1RUQ0FHQyBcKiByMDAzIDIwNjQgcmVmIDI5IDE3IDZINU0gXCogMCAwIFRBR0dDIFwqIFNBOlo6cmVmLDksKyw1UzZNLDMwLDE7IHIwMDEgMTQ3IHJlZiAzNyAzMCA5TSA9IDcgLTM5IENBR0NHR0NBVCBcKiBOTTppOjENCg0KcjAwMSwgcjAwMiB6aWpuIGRlIHJlYWQgbmFtZXMsIGRlIG51bW1lcnMgZXIgYWNodGVyIHppam4gZGUgYml0d2lzZSBmbGFnIHZhbHVlcyB3ZWxrZSBpbmZvcm1hdGllIG92ZXIgZGUgcmVhZHMgZ2VlZnQgem9hbHMgb2YgaGV0IHBhaXJlZCBpcyBvZiB1bm1hcHBlZC4gMzAgaXMgZGUga3dhbGl0ZWl0IHNjb3JlIHZvb3IgZGUgYWxpZ25tZW50LiBEZSBsZXR0ZXIgZW4gY2lqZmVyIG1peCB6b2FscyAiOE0ySTRNMUQzTSIgemlqbiBkZSBDSUdBUiBzdHJpbmcgZGllIGJlc2NocmlqdmVuIGhvZSBkZSByZWFkIGFsaWduZW4gbmFhciBkZSByZWYgYE1gID0gbWF0Y2gsIGBJYCA9IGluc2VydGlvbiwgYERgID0gZGVsZXRpb24sIGBTYCA9IHNvZnQgY2xpcHBpbmcsIGBQYCA9IHBhZGRpbmcuIERhYXJuYSB6aWpuIGRlIHJlYWRzIHRlIHppZW4gZW4gaGV0IGFuZGVyZSBvcHRpb25lbGUgdmVsZCB2b29yIGFsbGlnbm1lbnQgc2NvcmVzIG9mIGFsdGVybmF0aWV2ZSBhbGlnbm1lbnRzLg0KDQo8aHR0cHM6Ly9zYW10b29scy5naXRodWIuaW8vaHRzLXNwZWNzL1NBTXYxLnBkZj4NCg0KKkRlemUgY29kZSBpcyBnZXNjaHJldmVuIGRvb3IgZmxvcmlzLioNCg0KYGBge2Jhc2gsIGV2YWw9RkFMU0V9DQoNCg0KY2QgL3J1bi9tZWRpYS9mbG9yaXMvRkxPUklTXzMvREFUQV9TRVRTLzNEX0Nocm9tYXRpbmVfQ29uZm9ybWF0aWUvRE5BL1NSQQ0KDQoNCiMgSGV0IGluZGV4ZXJlbiB2YW4gaGV0IHJlZmVyZW50aWVnZW5vb20gbWV0IGJ3YS1tZW0yLiANCmJ3YS1tZW0yIGluZGV4IC1wIHRlc3RuYWFtIHJlZmVyZW50aWVnZW5vb20NCg0KIyBWb29yYmVlbGQgYWxpZ25pbmc6DQpid2EtbWVtMiBtZW0gcmVmLmZhIHJlYWQxLmZxIHJlYWQyLmZxID4gYWxuLXBlLnNhbQ0KDQojIEFsaWduIHNhbXBsZSBTUlIyNjk4MDU0OV8xLmZhc3RxIChkZWVsIDEgZW4gMikgbWV0IGhldCByZWZlcmVudGllZ2Vub29tIG1tMzkgbXVpcy4gDQouL2J3YV9tZW0yL2J3YS1tZW0yLTIuMi4xX3g2NC1saW51eC9id2EtbWVtMiBtZW0gLXAgNjAgdGVzdG5hYW0gZmFzdHEvU1JSMjY5ODA1NDlfMS5mYXN0cSBmYXN0cS9TUlIyNjk4MDU0OV8yLmZhc3RxID4gYWxpZ25lZF9TUlIyNjk4MDU0OS5zYW0gJg0KDQojIGZpbmQgL3J1bi9tZWRpYS9mbG9yaXMvRkxPUklTXzMvREFUQV9TRVRTLzNEX0Nocm9tYXRpbmVfQ29uZm9ybWF0aWUvRE5BL1NSQSAtbmFtZSAiKi5zcmEiIHwgXA0KIyAgIHBhcmFsbGVsIGZhc3RlcnEtZHVtcCAtTyAvcnVuL21lZGlhL2Zsb3Jpcy9GTE9SSVNfMy9EQVRBX1NFVFMvM0RfQ2hyb21hdGluZV9Db25mb3JtYXRpZS9ETkEvU1JBL0ZBU1RRIHt9DQoNCmBgYA0KDQpCaWogZGV6ZSBpbmRleGVyaW5nIGlzIGVlbiBhbGlnbmVkIGJlc3RhbmQgdmVya2VnZW4gd2F0IGVlbiAuc2FtIGZpbGUgaXMsIGRpdCBiZXN0YW5kIGlzIHRla3N0IG1ldCBlZW4gaGVhZGVyIGVuIGVlbiBhbGlnbm1lbnQgZGVlbC4gRGV6ZSBmaWxlIGhlZWZ0IGRlIHNlcXVlbnRpZXMgZGllIGFsaWduZWQgemlqbiB0ZWdlbiBoZXQgcmVmZW50aWUgc2VxdWVudGllIG9wZ2VzbGFnZW4uIE9tZGF0IGRlIC5TQU0gbmlldCBnZW9yZGVyZCB6aWpuIG9wIHBvc2l0aWUgaW4gaGV0IGdlbm9vbSBtb2V0ZW4gemUgZWVyc3QgbWV0IHNhbXRvb2xzIHNvcnQgb21nZXpldCB3b3JkZW4gbmFhciBlZW4gLkJBTSBiZXN0YW5kIChraWprIG5hYXIgaGV0IGxvZ2JvZWsgdmFuIGZsb3JpcyB2b29yIGVlbiBkaWVwZXJlIHVpdGxlZykgZGUgcmVkZW4gb20gZGl0IHRlIGRvZW4gaXMgZGF0IGhldCBvcHZyYWdlbiB2YW4gZGF0YSBzbmVsbGVyIGdlbWFha3Qgd29yZCBhbHMgaGV0IGdlw69uZGV4ZWVyZCBpcy4NCg0KU2FtdG9vbHMgdmVyc2llIDEuMTYuMSBpcyBnZWJydWlrdCBkaXQgaXMgZWVuIGNvbGxlY3RpZSB2YW4gdG9vbHMgb20gaGlnaC10aHJvdWdocG91dCBzZXF1ZW5jZSBkYXRhIHRlIHdlcmtlbi4gSGV0IGthbiB2ZXJzY2hpbGxlbmRlIGRpbmdlbiB6b2FscyBXR1MvV0VTIG1hcHBpbmcgbmFhciB2YXJpYW50IGNhbGxzIGVuIGhldCBmaWx0ZXJlbiB2YW4gLnZjZiBiZXN0YW5kZW4uIEBzYW10b29sc19tYXJrZHVwDQoNCi1PIEJBTSBnZWVmdCBoZXQgZm9ybWF0IGFhbiwgc2FtdG9vbHMgc29ydCAtbiB6b3JndCBkYXQgZGUgLnNhbSBnZXNvcnRlZXJkIHdvcmRlbiBvcCByZWFkIG5hYW0gKERlIFFOQU1FIGtvbG9tIGluIGhldCBiZXN0YW5kKQ0KDQpCQU0gZmlsZXMgemlqbiBuaWV0IGh1bWFhbiBsZWVzYmFhciBkdXMgb20gdGUgYmVncmlqcGVuIHdhdCBlciBpbiBzdGFhdCBpcyBoaWVyIGVlbiBmb3RvIHZvb3IgdWl0bGVnLg0KDQpbIVtCcm9uOiBodHRwczovL3NhbXRvb2xzLmdpdGh1Yi5pby9odHMtc3BlY3MvU0FNdjEucGRmXShpbWFnZXMvY2xpcGJvYXJkLTIxMTUwMzI1My5wbmcpXShodHRwczovL3NhbXRvb2xzLmdpdGh1Yi5pby9odHMtc3BlY3MvU0FNdjEucGRmKQ0KDQoqRGV6ZSBjb2RlIGlzIGdlc2NocmV2ZW4gZG9vciBmbG9yaXMqDQoNCmBgYHtiYXNoLCBldmFsPUZBTFNFfQ0KIyBWb29yIGVlbiBlbmtlbCBzYW1wbGU6DQpzYW10b29scyBzb3J0IC1uIC1PIEJBTSAtbyBhbGlnbmVkX3NvcnRlZF9TUlIyNjk4MDU0OS5iYW0gYWxpZ25lZF9TUlIyNjk4MDU0OS5zYW0NCg0KIyBNZXQgcGFyYWxsZWw6DQpjYXQgL3N0dWRlbnRzLzIwMjQtMjAyNS9UaGVtYTA1LzNkY29uZm9ybWF0aWVDaHJvbWF0aW5lL1NSQS9TcmFBY2NMaXN0LmNzdiB8IHBhcmFsbGVsICdzYW10b29scyBzb3J0IC1uIC1PIEJBTSAtbyBhbGlnbmVkX3NvcnRlZF97fS5iYW0gYWxpZ25lZF97fS5zYW0gJyAmDQoNCmBgYA0KDQoiZml4bWF0ZSAtbSIgdm9lZ3Qgc2NvcmUgdGFncyB0b2UgZGllIGdlYnJ1aWt0IHdvcmRlbiBkb29yIG1hcmtkdXAgb20gZGUgYmVzdGUgcmVhZHMgdGUgc2VsZWN0ZXJlbiBvbSB0ZSBiZWhvdWRlbi4NCg0KTWV0ICLigJRUaHJlYWRzIiB3b3JkdCBoZXQgYWFudGFsIHRocmVhZHMgZ2VzcGVjaWZpY2VlcmQgZGF0IGRlIGNvbXB1dGVyIG1vZXQgZ2VicnVpa2VuIHZvb3IgZGl0IGNvbW1hbmRvLiBAc2FtdG9vbHNfbWFya2R1cA0KDQpEZSByZWRlbiB3YWFyb20gamUgZGUgbWF0ZS1pbmZvcm1hdGllIHdpbCBjb3JyaWdlcmVuIGVuIG1vZ2VsaWprZSBkdXBsaWNhdGVuIHdpbCB3ZXRlbiBpcyBvbWRhdCBqZSB3aWwgZGF0IGRlIHBhaXJlZC1lbmQgcmVhZHMgZ29lZCB3b3JkZW4gZ2XDr250ZXJwcmV0ZWVyZC4gRGl0IGJldGVrZW50IGRhdCBqZSBnZWVuIHZhbHNlIHBvc2l0aWV2ZSBvZiB2YWxzZSBtdXRhdGllcyB3aWwgZGl0IHpvdSBuYW1lbGlqayBoZXQgb25kZXJ6b2VrIGNvbXByaW1lcmVuLiBIZXQgZXIgdWl0IGhhbGVuIHZhbiBkdXBsaWNhdGVuIGVuIGhldCBjb3JyaWdlcmVuIHZhbiBkZSBtYXRlLWluZm8gem9yZ3QgZHVzIHZvb3IgbWVlciBuYXV3a2V1cmlnaGVpZCBlbiBiZXRyb3V3YmFhcmhlaWQgdmFuIGRlICJkb3duc3RyZWFtIiBhbmFseXNlcyB6b2FscyB2YXJpYW50IGRldGVjdGllIGluIG9ucyBnZXZhbC4NCg0KKkRlemUgY29kZSBpcyBnZXNjaHJldmVuIGRvb3IgZmxvcmlzKg0KDQpgYGB7YmFzaCwgZXZhbD1GQUxTRX0NCiMgVm9vciBlZW4gZW5rZWwgc2FtcGxlOg0Kc2FtdG9vbHMgZml4bWF0ZSAtbSAtLXRocmVhZHMgMTYgYWxpZ25lZF9zb3J0ZWRfU1JSMjY5ODA1NDkuYmFtIFwgZml4ZWRfbWF0ZXNfYWxpZ25lZF9zb3J0ZWRfU1JSMjY5ODA1NDkuYmFtDQoNCiMgTWV0IHBhcmFsbGVsOg0KY2F0IC9zdHVkZW50cy8yMDI0LTIwMjUvVGhlbWEwNS8zZGNvbmZvcm1hdGllQ2hyb21hdGluZS9TUkEvU3JhQWNjTGlzdC5jc3YgfCBwYXJhbGxlbCAnc2FtdG9vbHMgZml4bWF0ZSAtbSAtLXRocmVhZHMgMTYgYWxpZ25lZF9zb3J0ZWRfe30uYmFtIGZpeGVkX21hdGVzX2FsaWduZWRfc29ydGVkX3t9LmJhbScgJg0KDQoNCmBgYA0KDQpNZXQgc2FtdG9vbHMgbWFya2R1cCB3b3JkZW4gZHVwbGljYXRlbiBnZW1hcmtlZXJkLiBNZXQgaGV0ICItciIgYXJndW1lbnQgd29yZGVuIGRlemUgdmVyd2lqZGVyZCBlbiBtZXQgIi1zIiB3b3JkZW4gc3RhdGlzdGlla2VuIG92ZXIgZGUgZGF0YSBlbiB1aXRnZXZvZXJkZSBoYW5kZWxpbmdlbi4NCg0KQnJvbjogQHNhbXRvb2xzX21hcmtkdXANCg0KKkRlemUgY29kZSBpcyBnZXNjaHJldmVuIGRvb3IgZmxvcmlzKg0KDQptYXJrZHVwLCBpcyBoZXQgY29tbWFuZG8gaW4gc2FtdG9vbHMgb20gbWFya2R1cCBhYW4gdGUgcm9lcGVuLCBtYXJrZHVwIHpvZWt0IG5hYXIgZHVwbGljYXRlbiBpbiBCQU0tYmVzdGFuZGVuDQoNCi1yLCBkZXplIG9wdGllIHpvcmd0IHZvb3IgZGF0IGR1cGxpY2F0ZW4gd29yZGVuICJyZW1vdmVkIiBvb2sgd2VsIHZlcndpamRlcmQgdWl0IGhldCBiZXN0YW5kLiBab25kZXIgZGV6ZSBvcHRpZSB6b3VkZW4gZGUgZHVwbGljYXRlbiBhbGxlZW4gd29yZGVuIGdlbWFya2VlcmQuDQoNCi1zLCBkZXplIG9wdGllIHpvcmd0IGRhdCBpbmZvcm1hdGllIG92ZXIgZGUgZHVwbGljYXRlbiBuYWFyIFNUREVSUiAoZm91dHVpdHZvZXIpIGdlc2NocmV2ZW4gd29yZGVuLCBkaXQgaXMgaGFuZGlnIHZvb3IgbG9nZ2VuIGVuIHRyb3VibGUgc2hvb3Rlbi4NCg0Kc29ydGVkX2Nvb3JkaW5hdGVzX1NSUjI2OTgwNTQ5LmJhbSwgZGl0IGlzIGhldCBpbnB1dCBCQU0gYmVzdGFuZCB3YWFyaW4gZGUgcmVhZHMgb3AgaHVuIGdlbm9vbWNvw7ZyZGluYXRlbiB6aWpuIGdlc29ydGVlcmQuIFpvbmRlciBkaXQgYmVzdGFuZCB3ZXJrdCBtYXJrZHVwIG5pZXQNCg0KZGVkdXBfU1JSMjY5ODA1NDkuYmFtLCBkaXQgaXMgaGV0IG91dHB1dCBCQU0gYmVzdGFuZCB3YWFyaW4gZGUgZHVwaWNhdGVuIHppam4gZ2VtYXJrZWVyZCBlbiBpbiBvbnMgZ2V2YWwgb29rIHZlcndpamRlcmQuDQoNCkRlIHJlZGVuIG9tIG1hcmtkdXAgdGUgZ2VicnVpa2VuIGVuIGR1cyBkZSBkdXBsaWNhdGVuIHRlIG1hcmtlcmVuIGVuIHZlcndpamRlcmVuIGlzLCB2b29yIG1lZXIgbmF1d2tldXJpZ2hlaWQgaW4gZGUgZGF0YSwgb29rIGRlIGJldHJvdXdiYWFyaGVpZCB2YW4gZGUgZG93bnN0cmVhbSBhbmFseXNlIHdvcmR0IGhvZ2VyLg0KDQpgYGB7YmFzaCwgZXZhbD1GQUxTRX0NCiMgVm9vciBlZW4gZW5rZWwgc2FtcGxlOg0Kc2FtdG9vbHMgbWFya2R1cCAtciAtcyBzb3J0ZWRfY29vcmRpbmF0ZXNfU1JSMjY5ODA1NDkuYmFtIGRlZHVwX1NSUjI2OTgwNTQ5LmJhbQ0KDQojIE1ldCBwYXJhbGxlbDoNCmNhdCAvc3R1ZGVudHMvMjAyNC0yMDI1L1RoZW1hMDUvM2Rjb25mb3JtYXRpZUNocm9tYXRpbmUvU1JBL1NyYUFjY0xpc3QuY3N2IHwgcGFyYWxsZWwgICdzYW10b29scyBtYXJrZHVwIC1yIC1zIHNvcnRlZF9jb29yZGluYXRlc197fS5iYW0gZGVkdXBfe30uYmFtJyAmDQoNCmBgYA0KDQpNZXQgc2FtdG9vbHMgaW5kZXggd29yZHQgZXIgZWVuIGluZGV4IGJlc3RhbmQgZ2VtYWFrdCBiaWogZWxrZSBzYW1wbGUNCg0KaW5kZXgsIGRpdCBpcyBoZXQgY29tbWFuZG8gb20gaW5kZXhpbmcgYWFuIHRlIHJvZXBlbiBpbiBkZSBzYW10b29scyB0b29sa2l0Lg0KDQp2ZXJkZXIgemlqbiBkZSBpbnB1dCBlbiBvdXB1dCBzYW1wbGUgdGUgemllbiBkZWR1cF9TUlIyNjk4MDU0OS5iYW0gZW4gZGVkdXBfU1JSMjY5ODA1NDkuYmFpIGVyIGlzIHdlbCBpZXRzIHZlcmFuZGVyZCBhYW4gZGUgZXh0ZW5zaWUuIEhldCBpcyB2YW4gLmJhbSBuYWFyIC5iYWkgZ2VnYWFuLCBkZSBhZmtvcnRpbmcgLmJhaSBzdGFhdCB2b29yIEJBTSBpbmRleA0KDQpBbHMgbGFhdHN0ZSBpcyBkZSAmIHRlIHppZW4sIGRpdCB6b3JndCBlcnZvb3IgZGF0IGhldCBiYXNoIHNjcmlwdCBvcCBkZSBhY2h0ZXJncm9uZCB3b3JkdCB1aXRnZXZvZXJkLg0KDQpEZSByZWRlbiBvbSBkZSBzYW1wbGVzIHRlIGluZGV4ZW4gaXMgb21kYXQgZ2XDr25kZXhlZXJkZSBiZXN0YW5kZW4gc25lbGxlciB6aWpuLCBkaXQgaW4gZGUgemluIHZhbiB6b2VrZW4gbmFhciBzcGVjaWZpZWtlIHJlZ2lvcy4gSW4gZWVuIGdlw69uZGV4ZWVyZCBiZXN0YW5kIGlzIGhldCBtb2dlbGlqayBvbSBkaXJlY3Qgc3BlY2lmaWVrZSBkZWxlbiB0ZSBiZXpvZWtlbiwgdm9vciBzb21taWdlIHByb2dyYW1hJ3MgaXMgaGV0IG9vayBlZW4gdmVyZWlzdGUgb20gZ2XDr25kZXhlZXJkZSBkYXRhIHRlIGhlYmJlbi4gRGl0IHppam4gcHJvZ3JhbW1hcyB6b2FscyBJR1YgKEludGVncmF0aXZlIEdlbm9taWNzIFZpZXdlcikgd2FhciB2aXN1ZWVsIG5hYXIgZGF0YSBnZWtla2VuIHdvcmQuIEtvcnRvbSBlZmZpY2nDq250aWUNCg0KRWVuIEJBSSBvb2sgd2VsIEJBTSBpbmRleCBmaWxlIGlzIGVlbiBiaW5haXIgZmlsZSwgaGllciBpcyBlZW4gdm9vcmJlZWxkIHZhbiBob2UgZWVuIGJhaSBmaWxlIGVyIHVpdCBrYW4gemllbg0KDQoqRGV6ZSBjb2RlIGlzIGdlc2NocmV2ZW4gZG9vciBmbG9yaXMqDQoNCmBgYHtiYXNoLCBldmFsPUZBTFNFfQ0KIyBWb29yIGVlbiBlbmtlbCBzYW1wbGU6DQpzYW10b29scyBpbmRleCBkZWR1cF9TUlIyNjk4MDU0OS5iYW0gZGVkdXBfU1JSMjY5ODA1NDkuYmFpICAmDQoNCiMgTWV0IHBhcmFsbGVsOg0KY2F0IC9zdHVkZW50cy8yMDI0LTIwMjUvVGhlbWEwNS8zZGNvbmZvcm1hdGllQ2hyb21hdGluZS9TUkEvU3JhQWNjTGlzdC5jc3YgfCBwYXJhbGxlbCAnc2FtdG9vbHMgaW5kZXggZGVkdXBfe30uYmFtIGRlZHVwX3t9LmJhaScgJg0KDQpgYGANCg0KQnJvbjogPGh0dHBzOi8vZ2l0aHViLmNvbS9mcmVlYmF5ZXMvZnJlZWJheWVzPiBNZXQgYmVodWxwIHZhbiBoZXQgb25kZXJzdGFhbmRlIHN0dWsgY29kZSB3b3JkZW4gZGUgcmVzdWxhdGVuIHZhbiBkZSBmcmVlYmF5ZXMgdmFyaWFudCBjYWxsaW5nIGRpcmVjdCBnZWZpbHRlcmQgb3Aga3dhbGl0ZWl0IG1ldCB2Y2ZmaWx0ZXIuIE1ldCAiUVVBTCA9IDIwIiB3b3JkZW4gZW5rZWwgZGUgdmFyaWFudHMgZ2VzZWxlY3RlZXJkIGRpZSA5OSUga2FucyBoZWJiZW4gZGF0IGVyIGVlbiB2YXJpYW50IHppdCBvcCBkaWUgcGxhYXRzLg0KDQoqKkZyZWViYXllcyoqIC0gaXMgZGUgdG9vbCBkaWUgZ2VicnVpa3Qgd29yZHQgb20gZ2VuZXRpc2NoZSB2YXJpYW50ZW4gdGUgZGV0ZWN0ZXJlbiBvb2sgd2VsICJ2YXJpYW50IGNhbGxpbmciIGRlIGdlYnJ1aWt0ZSB2ZXJzaWUgaXMgMS4zLjYgb3AgbGludXgNCg0KLWYsIGRlemUgb3B0aWUgZ2VlZnQgaGV0IHJlZmVyZW50aWUgZ2Vub29tIGFhbiBkYXQgZ2VicnVpa3Qgd29yZHQgYmlqIGhldCB2ZXJnZWxpamtlbiB2YW4gZGUgc2VxdWVudGllLXJlYWRzLiBGcmVlYmF5ZXMgZ2VicnVpa3QgZGl0IHJlZmVyZW50aWVnZW5vb20gKHJlZmVyZW50aWUgZ2Vub29tIGlzIEdSQ20zOSkgb20gZ2VuZXRpc2NoZSB2YXJpYW50ZW4gdGUgZGV0ZWN0ZXJlbi4NCg0KSGV0IGRlZHVwX1NSUjI2OTgwNTQ5LmJhbSBiZXN0YW5kIGlzIGhldCBiZXN0YW5kIHdhdCBhbHMgaW5wdXQgd29yZHQgZ2VicnVpa3QsIGZyZWViYXllcyBraWprdCBpbiBkZWl0IGJlc3RhbmQgZGUgdWl0Z2VsaWpuZGUgcmVhZHMgb20gZ2VuZXRpc2NoZSB2YXJpYW50ZW4gdGUgZGV0ZWN0ZXJlbg0KDQpIZXQgIlx8IiBzeW1ib29sIGlzIGVlbiBwaXBlLCB3YWFybWVlIGRlIHVpdHZvZXIgdmFuIGZyZWViYXllcyBnZWxpamsgZG9vcmdlZ2V2ZW4gd29yZHQgYWFuIHZjZmZpbHRlciB6b25kZXIgZWVuIHR1c3NlbmJlc3RhbmQgdGUgbWFrZW4uDQoNCnZjZmZpbHRlciwgZGl0IGlzIGVlbiB0b29sIGRpZSB3b3JkdCBnZWJydWlrdCBvbSBWQ0YtYmVzdGFuZGVuIHRlIGZpbHRlcmVuIG9wIGJhc2lzIHZhbiBiZXBhYWxkZSBjcml0ZXJpYS4gSW4gb25zIGdldmFsIGdlYnJ1aWtlbiB3aWogdmNmZmlsdGVyLWFzc2VtYmx5LTAuMiBqYXIuIGRlIGNyaXRlcmlhIGRpZSB3aWogaGViYmVuIGdlemV0IGlzIGVlbiBtaW5pbWFsZSBrd2FsaXRlaXQgaG9nZXIgZGFuIDIwIGRpdCB3b3JkdCBnZWRhYW4gbWV0ICJRVUFMIFw+IDIwIg0KDQpEZSByZWRlbiBvbSBlZW4gVkNGLWJlc3RhbmQgb29rIHdlbCBWYXJpYW50IENhbGwgRm9ybWF0IHRlIG1ha2VuIGlzIGhldCBvcHNsYWFuIHZhbiBnZW5ldGlzY2hlIHZhcmlhbnRlbi4gSGV0IFZDRiBiZXN0YW5kIGlzIGVzc2VudGllZWwgdm9vciBkZSB2aXN1YWxpc2F0aWUgZGllIHdpaiBsYXRlciBnYWFuIGRvZW4uDQoNCkhpZXIgaXMgZWVuIHZvb3JiZWVsZCB2YW4gaG9lIGVlbiBWQ0YtYmVzdGFuZCBlciB1aXQga2FuIHppZW46DQoNCiMjZmlsZWZvcm1hdD1WQ0Z2NC4zwqAtIEhpZXIgc3RhYXQgaGV0IEZvcm1hdCBlbiBkZSB2ZXJzaWVcDQojI2ZpbGVEYXRlPTIwMDkwODA1wqAtIERlIGRhdHVtIHZhbiBnZW5lcmF0aWUgdmFuIGRlemUgZmlsZVwNCiMjc291cmNlPW15SW1wdXRhdGlvblByb2dyYW1WMy4xwqAtIHNvdXJjZSB0b29sIHdhYXJtZWUgZGUgVkNGIGlzIGdlbm1hYWt0XA0KIyNyZWZlcmVuY2U9PGZpbGU6Ly8vc2VxL3JlZmVyZW5jZXMvMTAwMEdlbm9tZXNQaWxvdC1OQ0JJMzYuZmFzdGE+wqAtIHJlZmVyZW50aWUgZ2Vub29tIGdlYnJ1aWt0IHZvb3IgdmFyaWFudCB6b2VrZW5cDQojI2NvbnRpZ1w8SUQ9MjAsbGVuZ3RoPTYyNDM1OTY0LGFzc2VtYmx5PUIzNixtZDU9ZjEyNmNkZjhhNmUwYzdmMzc5ZDYxOGZmNjZiZWIyZGEsc3BlY2llcz0iSG9tbyBzYXBpZW5zIix0YXhvbm9teT14XD7CoC0gSUQgdmFuIGNocm9tb3Nvb20gb2Ygc2NhZmZvbGQgKyBsZW5ndGhlIGluIGJhc2UgcGFyZW4uXA0KIyNwaGFzaW5nPXBhcnRpYWzCoC0gaGV0IHByb2NlcyB2YW4gdG9ld2lqemVuIHZhbiBhbGxlbGVuIGFhbiBkZSBjaHJvbW9zb21lblwNCiMjSU5GTz1cPElEPU5TLE51bWJlcj0xLFR5cGU9SW50ZWdlcixEZXNjcmlwdGlvbj0iTnVtYmVyIG9mIFNhbXBsZXMgV2l0aCBEYXRhIlw+wqBcDQojI0lORk89XDxJRD1EUCxOdW1iZXI9MSxUeXBlPUludGVnZXIsRGVzY3JpcHRpb249IlRvdGFsIERlcHRoIlw+wqBcDQojI0lORk89XDxJRD1BRixOdW1iZXI9QSxUeXBlPUZsb2F0LERlc2NyaXB0aW9uPSJBbGxlbGUgRnJlcXVlbmN5Ilw+wqBcDQojI0lORk89XDxJRD1BQSxOdW1iZXI9MSxUeXBlPVN0cmluZyxEZXNjcmlwdGlvbj0iQW5jZXN0cmFsIEFsbGVsZSJcPsKgXA0KIyNJTkZPPVw8SUQ9REIsTnVtYmVyPTAsVHlwZT1GbGFnLERlc2NyaXB0aW9uPSJkYlNOUCBtZW1iZXJzaGlwLCBidWlsZCAxMjkiXD7CoFwNCiMjSU5GTz1cPElEPUgyLE51bWJlcj0wLFR5cGU9RmxhZyxEZXNjcmlwdGlvbj0iSGFwTWFwMiBtZW1iZXJzaGlwIlw+wqBcDQojI0ZJTFRFUj1cPElEPXExMCxEZXNjcmlwdGlvbj0iUXVhbGl0eSBiZWxvdyAxMCJcPsKgXA0KIyNGSUxURVI9XDxJRD1zNTAsRGVzY3JpcHRpb249Ikxlc3MgdGhhbiA1MCUgb2Ygc2FtcGxlcyBoYXZlIGRhdGEiXD7CoFwNCiMjRk9STUFUPVw8SUQ9R1QsTnVtYmVyPTEsVHlwZT1TdHJpbmcsRGVzY3JpcHRpb249Ikdlbm90eXBlIlw+wqBcDQojI0ZPUk1BVD1cPElEPUdRLE51bWJlcj0xLFR5cGU9SW50ZWdlcixEZXNjcmlwdGlvbj0iR2Vub3R5cGUgUXVhbGl0eSJcPsKgXA0KIyNGT1JNQVQ9XDxJRD1EUCxOdW1iZXI9MSxUeXBlPUludGVnZXIsRGVzY3JpcHRpb249IlJlYWQgRGVwdGgiXD7CoFwNCiMjRk9STUFUPVw8SUQ9SFEsTnVtYmVyPTIsVHlwZT1JbnRlZ2VyLERlc2NyaXB0aW9uPSJIYXBsb3R5cGUgUXVhbGl0eSJcPsKgXA0KI0NIUk9NIFBPUyDCoMKgwqDCoMKgSUQgwqDCoMKgwqDCoMKgwqDCoFJFRiDCoMKgQUxUIMKgwqDCoFFVQUwgwqBGSUxURVIgwqDCoElORk8gwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBGT1JNQVQgwqDCoMKgwqDCoMKgTkEwMDAwMSDCoMKgwqDCoMKgwqDCoMKgTkEwMDAwMiDCoMKgwqDCoMKgwqDCoMKgwqBOQTAwMDAzwqBcDQoyMCDCoMKgwqDCoDE0MzcwIMKgwqDCoHJzNjA1NDI1NyDCoEcgwqDCoMKgwqBBIMKgwqDCoMKgwqAyOSDCoMKgwqBQQVNTIMKgwqDCoE5TPTM7RFA9MTQ7QUY9MC41O0RCO0gyIMKgwqDCoMKgwqDCoMKgwqDCoMKgR1Q6R1E6RFA6SFEgwqAwXHwwOjQ4OjE6NTEsNTEgwqAxXHwwOjQ4Ojg6NTEsNTEgwqDCoDEvMTo0Mzo1Oi4sLsKgXA0KMjAgwqDCoMKgwqAxNzMzMCDCoMKgwqAuIMKgwqDCoMKgwqDCoMKgwqDCoFQgwqDCoMKgwqBBIMKgwqDCoMKgwqAzIMKgwqDCoMKgcTEwIMKgwqDCoMKgTlM9MztEUD0xMTtBRj0wLjAxNyDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgR1Q6R1E6RFA6SFEgwqAwXHwwOjQ5OjM6NTgsNTAgwqAwXHwxOjM6NTo2NSwzIMKgwqDCoMKgMC8wOjQxOjPCoFwNCjIwIMKgwqDCoMKgMTExMDY5NiDCoHJzNjA0MDM1NSDCoEEgwqDCoMKgwqBHLFQgwqDCoMKgNjcgwqDCoMKgUEFTUyDCoMKgwqBOUz0yO0RQPTEwO0FGPTAuMzMzLDAuNjY3O0FBPVQ7REIgR1Q6R1E6RFA6SFEgwqAxXHwyOjIxOjY6MjMsMjcgwqAyXHwxOjI6MDoxOCwyIMKgwqDCoMKgMi8yOjM1OjTCoFwNCjIwIMKgwqDCoMKgMTIzMDIzNyDCoC4gwqDCoMKgwqDCoMKgwqDCoMKgVCDCoMKgwqDCoC4gwqDCoMKgwqDCoDQ3IMKgwqDCoFBBU1MgwqDCoMKgTlM9MztEUD0xMztBQT1UIMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoEdUOkdROkRQOkhRIMKgMFx8MDo1NDo3OjU2LDYwIMKgMFx8MDo0ODo0OjUxLDUxIMKgwqAwLzA6NjE6MsKgXA0KMjAgwqDCoMKgwqAxMjM0NTY3IMKgbWljcm9zYXQxIMKgR1RDIMKgwqBHLEdUQ1QgNTAgwqDCoMKgUEFTUyDCoMKgwqBOUz0zO0RQPTk7QUE9RyDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoEdUOkdROkRQIMKgwqDCoMKgMC8xOjM1OjQgwqDCoMKgwqDCoMKgwqAwLzI6MTc6MiDCoMKgwqDCoMKgwqDCoMKgMS8xOjQwOjPCoA0KDQpgYGB7YmFzaCwgZXZhbD1GQUxTRX0NCiMgVm9vciBlZW4gYmVzdGFuZDoNCi9zdHVkZW50cy8yMDI0LTIwMjUvVGhlbWEwNS8zZGNvbmZvcm1hdGllQ2hyb21hdGluZS9mcmVlYmF5ZXMvZnJlZWJheWVzLTEuMy42LWxpbnV4LWFtZDY0LXN0YXRpYyBcDQogLWYgL3N0dWRlbnRzLzIwMjQtMjAyNS9UaGVtYTA1LzNkY29uZm9ybWF0aWVDaHJvbWF0aW5lL01hcHBpbmdfcmVmL25jYmlfZGF0YXNldC9uY2JpX2RhdGFzZXQvZGF0YS9HQ0FfMDAwMDAxNjM1LjkvR0NBXzAwMDAwMTYzNS45X0dSQ20zOV9nZW5vbWljLmZuYSBkZWR1cF9TUlIyNjk4MDU0OS5iYW0gfCAvc3R1ZGVudHMvMjAyNC0yMDI1L1RoZW1hMDUvM2Rjb25mb3JtYXRpZUNocm9tYXRpbmUvdmNmZmlsdGVyL3ZjZmZpbHRlci1hc3NlbWJseS0wLjIuamFyIC1mICJRVUFMID4gMjAiID4gZmlsdGVyZWRfU1JSMjY5ODA1NDkudmNmDQogDQogDQojIE1ldCBwYXJhbGxlbDogDQpjYXQgL3N0dWRlbnRzLzIwMjQtMjAyNS9UaGVtYTA1LzNkY29uZm9ybWF0aWVDaHJvbWF0aW5lL1NSQS9TcmFBY2NMaXN0LmNzdiB8IHBhcmFsbGVsICcvc3R1ZGVudHMvMjAyNC0yMDI1L1RoZW1hMDUvM2Rjb25mb3JtYXRpZUNocm9tYXRpbmUvZnJlZWJheWVzL2ZyZWViYXllcy0xLjMuNi1saW51eC1hbWQ2NC1zdGF0aWMgXA0KIC1mIC9zdHVkZW50cy8yMDI0LTIwMjUvVGhlbWEwNS8zZGNvbmZvcm1hdGllQ2hyb21hdGluZS9NYXBwaW5nX3JlZi9uY2JpX2RhdGFzZXQvbmNiaV9kYXRhc2V0L2RhdGEvR0NBXzAwMDAwMTYzNS45L0dDQV8wMDAwMDE2MzUuOV9HUkNtMzlfZ2Vub21pYy5mbmEgZGVkdXBfe30uYmFtIHwgL3N0dWRlbnRzLzIwMjQtMjAyNS9UaGVtYTA1LzNkY29uZm9ybWF0aWVDaHJvbWF0aW5lL3ZjZmZpbHRlci92Y2ZmaWx0ZXItYXNzZW1ibHktMC4yLmphciAtZiAiUVVBTCA+IDIwIiA+IGZpbHRlcmVkX3t9LnZjZicgJg0KYGBgDQoNCk9tIGFsbGUgcGFpcmVkIHJlYWQgc2FtcGxlcyB0ZSBtYXBwZW4gaXMgaGV0IG9uZGVyc3RhYW5kZSBiYXNoIHNjcmlwdCBnZWJydWlrdC4gSGllciBpcyB3ZWVyIGhldCBwYXJhbGxlbCBjb21tYW5kbyB2b29yIGdlYnJ1aWt0LiBEZSBsaWpzdCBtZXQgc2FtcGxlIG5hbWVuIHdvcmR0IGFhbiBid2EtbWVtMiBnZWdldmVuIHpvZGF0IGhldCBwcm9ncmFtbWEgbmFhciBpbnB1dCBiZXN0YW5kZW4gbWV0IGRlemUgbmFtZW4ga2FuIGtpamtlbiBlbiBkZSBnZWdlbmVyZWVyZGUgLnNhbSBiZXN0YW5kZW4gb29rIGRlemUgbmFhbSB0ZSBnZXZlbi4NCg0KYGBge2Jhc2gsIGV2YWw9RkFMU0V9DQojY2F0IGNvbmNhdGluYXRlIGRlIHNyYWFjY2xpc3QgZW4gZ2VlZnQgaGV0IG1lZSBhYW4gcGFyYWxsZWwNCmNhdCAvc3R1ZGVudHMvMjAyNC0yMDI1L1RoZW1hMDUvM2Rjb25mb3JtYXRpZUNocm9tYXRpbmUvU1JBL1NyYUFjY0xpc3QuY3N2IHwNCiNwYXJhbGxlbCB6b3JndCBkYXQgZGUgdG9vbCB0ZWdlbGlqa2VydGlqZCB1aXQgZ2V2b2VyZCB3b3JkdC4gaGllciB2b2VydCBoZXQgdm9vciBlbGsgc2FtcGxlIGluIGRlIGxpanN0IGhldCBidy1tZW0yIGNvbW1hbmRvIHVpdA0KcGFyYWxsZWwgJy9zdHVkZW50cy8yMDI0LTIwMjUvVGhlbWEwNS8zZGNvbmZvcm1hdGllQ2hyb21hdGluZS9id2FfbWVtMi9id2EtbWVtMi0yLjIuMV94NjQtbGludXgvYndhLW1lbTIgbWVtIC10IDYwIHRlc3RuYWFtIC9zdHVkZW50cy8yMDI0LTIwMjUvVGhlbWEwNS8zZGNvbmZvcm1hdGllQ2hyb21hdGluZS9mYXN0cS97fV8xLmZhc3RxIC9zdHVkZW50cy8yMDI0LTIwMjUvVGhlbWEwNS8zZGNvbmZvcm1hdGllQ2hyb21hdGluZS9mYXN0cS97fV8yLmZhc3RxID4gL3N0dWRlbnRzLzIwMjQtMjAyNS9UaGVtYTA1LzNkY29uZm9ybWF0aWVDaHJvbWF0aW5lL21hcHBpbmcve30uc2FtJyAmDQoNCmBgYA0KDQpid2EtbWVtMiBtZW0gcm9lcHQgaGV0IHByb2dyYW1tYSBid2EtbWVtMiBhYW4gZGl0IHdvcmR0IGdlYnJ1aWt0IG9tIGRlIGlsbHVtaW5hIHNlcXVlbnRpZXMgdGUgbWFwcGVuDQoNCi10IDYwIGdlZWZ0IGFhbiBkYXQgaGV0IHByb2NlcyA2MCB0aHJlYWRzIG1vZXQgZ2VicnVpa2VuIG9tIGRlIHNuZWxoZWlkIHRlIHZlcmhvZ2VuLiBEaXQgaXMgaGFuZGlnIG9tIHRlIGRvZW4gdm9vciB1aXRsaWpuaW5nIHZhbiBncm90ZSBob2V2ZWVsaGVkZW4gZGF0YSBvbWRhdCBoZXQgZGFuIHNuZWxsZXIgdmVyd2Vya3Qgd29yZHQuDQoNCi9zdHVkZW50cy8yMDI0LTIwMjUvVGhlbWEwNS8zZGNvbmZvcm1hdGllQ2hyb21hdGluZS9mYXN0cS97fVxfMS5mYXN0cSBlbiAvc3R1ZGVudHMvMjAyNC0yMDI1L1RoZW1hMDUvM2Rjb25mb3JtYXRpZUNocm9tYXRpbmUvZmFzdHEve31cXzIuZmFzdHEgZ2VlZnQgZGUgcGF0aHMgbmFhciBkZSBmYXN0cSBpbnB1dCBiZXN0YW5kZW4gd2Vlci4NCg0KL3N0dWRlbnRzLzIwMjQtMjAyNS9UaGVtYTA1LzNkY29uZm9ybWF0aWVDaHJvbWF0aW5lL21hcHBpbmcve30uc2FtIGdlZWZ0IGRlIHBhdGggd2FhciBkZSBvdXRwdXQgYmVzdGFuZGVuIGhlZW4gbW9ldGVuDQoNCiYgZGl0IHpldCBoZXQgaGVsZSBwYXJhbGxlbC1wcm9jZXMgb3AgZGUgYWNodGVyZ3JvbmQgem9kYXQgZGUgc2hlbGwgYmVzY2hpa2JhYXIgaXMgdGlqZGVucyBoZXQgcHJvY2VzLg0KDQojIyBXZWVrIDMgLSBEYXRhIFRyaW1taW5nICYgMmRlIGt3YWxpdGVpdCBjaGVjaw0KDQoqKkRvZWxlbiB2YW4gZGUgd2VlayoqDQoNCkRhdGEgdHJpbW1lbg0KDQpRdWFsaXR5IGhlcmNoZWNrZW4NCg0KVmFyaWFudGllIGRldGVjdGllDQoNCioqVGFrZW4gbGlqc3QqKg0KDQotICAgRmFzdHEgcXVhbGl0eSBjaGVja2VuIGVuIGtpamtlbiBob2UgZGUgZGF0YSBtb2V0IHdvcmRlbiBnZXRyaW1kDQotICAgRGF0YSB0cmltbWVuDQotICAgRnJlZWJheWVzIHNjcmlwdCBzY2hyaWp2ZW4NCg0KIyMjIFRyaW1tb21hdGljDQoNClRyaW1tb21hdGljIGlzIGVlbiBmbGV4aWJlbCB0cmltc29mdHdhcmUgdm9vciBpbGx1bWluYSBzZXF1ZW5jZSBkYXRhLCBoZXQga2FuIHpvd2VsIHBhaXJlZC1lbmQgYWxzIGRzaW5nbGUgZW5kZWQgZGF0YSBhYW4uIEVyIHppam4gdmVyc2NoaWxsZW5kZSBzdGFwcGVuIGluIGhldCB0cmltbWVuIGVuIHZlcnNjaGlsbGVuZGUgcGFyYW1ldGVycy4gVHJpbW1vbWF0aWMgaXMgZWVuIGNvbW1hbmQgbGluZSBnZXJ1bmRlIHRvb2wuIERlIHZvb3JkZWxlbiB2YW4gdHJpbW1vbWF0aWMgemlqbiBkYXQgaGV0IGdvZWQgb21nYWF0IG1ldCBoZXQgImNvbGxhcHNpbmciIGVuICJ0cmltbWluZyIgdmFuIHBhaXJlZC1lbmQgZW4gc2VxdWVuY2luZyB2YW4gZnJhZ21lbnRlbiBkaWUga29ydGVuIHppam4gZGFuIGRlIGxlZXNsZW5ndGUsIHdhYXJiaWogZGUgbGVlc2xlbmd0ZSB6aWNoIGFhbiBoZXQgZWluZGUgdmFuIGVsa2UgbGVlc2xlbmd0ZSB1aXRzdHJla3QgdG90IGluIGRlIGFkYXB0ZXJzLiBIZXQgem9yZ3Qgb29rIGRhdCB0ZXJ3aWpsIGhldCBkZSBkYXRhIHNjaG9vbm1hYWt0IHppam4gaW50ZXJncml0ZWl0IGJlaG91ZC4NCg0KSGV0IHRyaW1tZW4gdmFuIGRlIGRhdGEgaXMgbm9kaWcgb21kYXQgem9hbHMgdGUgemllbiBpbiBoZXQgbG9nYm9layB2YW4gU3Rvcm0gZW4gSXZhciBkZSBrd2FsaXRlaXQgdmFuIG9uemUgZGF0YSBuaWV0IGhvb2cgaXMuIE9tIGRpdCB0ZSB2ZXJiZXRlcmVuIG1vZXRlbiB3aWogdHJpbW1lbiwgZGUgcmVkZW4gZGF0IHdpaiBob2dlcmUga3dhbGl0ZWl0IGRhdGEgd2lsbGVuIGlzIG9tZGF0IGVyIGdlZW4gY29uY2x1c2llIGthbiB3b3JkZW4gZ2V0cm9ra2VuIHVpdCBzbGVjaHRlIGt3YWxpdGVpdCBkYXRhIG9tZGF0IGhldCBmb3V0IGthbiB6aWpuLiBEZSBUcmltbW9tYXRpYyBpcyBnb2VkIGFhbiB0ZSBwYXNzZW4gZW4ga2FuIGFkYXB0ZXJzIHdlZ2hhbGVuIGRlemUgdHdlZSBkaW5nZW4gemlqbiBlc3NlbnRpZWVsIGRpdCBvbWRhdCBvbnplIGRhdGEgaXMgZ2VzZXF1ZW5jZWQgdWl0IGlsdW1pbmEgYXBwYXJhdHV1ciB3YXQgZHVzIGthbiBiZXRla2VuZW4gZGF0IGhldCBpbHVtaW5hIGFkYXB0ZXJzIGhlZWZ0LCBlbiBvbWRhdCB3aWogc3BlY2lmaWVrZSBhYW5wYXNzaW5nZW4gd2lsbGVuIG1ha2VuIGRpZSBtZXQgdHJpbW1vbWF0aWMgZ29lZCBrdW5uZW4gd29yZGVuIGdlZGFhbi4NCg0KYGBge2Jhc2gsIGV2YWw9RkFMU0V9DQoNCmNhdCBkYXRhL0dTRTE0OTk5NV9TcmFfUnVuSW5mby5jc3YgfCBcDQogIHBhcmFsbGVsICdUcmltbW9tYXRpY1BFIC10aHJlYWRzIDE2ICcgXA0KICAgICAgICAgICAgICAgICAgJy9zdHVkZW50cy8yMDI0LTIwMjUvVGhlbWEwNS8zZGNvbmZvcm1hdGllQ2hyb21hdGluZS9mYXN0cS97fS5mYXN0cS5neiAnIFwNCiAgICAgICAgICAgICAgICAgICcvc3R1ZGVudHMvMjAyNC0yMDI1L1RoZW1hMDUvM2Rjb25mb3JtYXRpZUNocm9tYXRpbmUvZmFzdHEtdHJpbW1lZC97fS50cmltbWVkLmZhc3RxLmd6ICcgXA0KICAgICAgICAgICAgICAgICAgJ0lMTFVNSU5BQ0xJUDovaG9tZXMvbWFyY2Vsay9EZXZlbG9wbWVudC8yLjEuMi1UcmFuc2NyaXB0b21pY3MvVHJ1U2VxMy1TRS5mYToyOjMwOjEwICcgXA0KICAgICAgICAgICAgICAgICAgJ01JTkxFTjo0MCAnIFwNCiAgICAgICAgICAgICAgICAgICdTTElESU5HV0lORE9XOjQ6MjAnDQoNCmBgYA0KDQpIaWVyIGlzIGhldCBiYXNoIHNjcmlwdCB0ZSB6aWVuIGRhdCB3aWogaGViYmVuIGdlYnJ1aWt0IG9tIG9uemUgZGF0YSB0ZSB0cmltbWVuLiBFZXJzdCBpcyBkZSBjYXQgY29tbWFuZCB0ZSB6aWVuIGRpdCBpcyBvb2sgd2VsIGNvbmNhdGVuYXRlIGRpdCByZWFkIGRlIGZpbGUgZW4gcHJpbnQgemlqbiBjb250ZW50LiBIZXQgbGVlc3QgZGUgR1NFMTQ5OTk1X1NyYV9SdW5JbmZvIGRlemUgZmlsZSBpcyBiZWxhbmdyaWprIG9tZGF0IGhldCBtZXRhZGF0YSBiZXZhdCBvdmVyIGRlIHNlcXVlbmNlaW5nIHJ1bnMgZGllIGdlZG93bG9hZCB6aWpuIHVpdCBkZSBTUkEgZGF0YWJhc2UsIGVyIGt1bmVuIGRpbmdlbiBpbnN0YWFuIHpvYWxzIFNhbXBsZSBuYW1lcywgU2VxdWVuY2luZyBwbGF0Zm9ybSwgUnVuIGFjY2VzaW9uIG51bWJlcnMgZW4gbm9nIGFuZGVyZSBkYXRhLg0KDQpwYXJhbGxlbCBpcyBlZW4gY29tbWFuZCBkYXQgdHJpbW9tYXRpYyBtZWVyZGVyZSBjb3JlcyB0ZWdlbGlqayBtb2V0IGdlYnJ1aWtlbiwgZGl0IGRvZW4gd2lqIG9tZGF0IGhldCBwcm9ncmFtbWEgZGFuIHNuZWxsZXIgZGUgZGF0YSBrYW4gdmVyd2Vya2VuLg0KDQpNZXQgLXRocmVhZHMgMTYgd29yZCBhYW5nZWdldmVuIGRhdCBoZXQgMTYgdGhyZWFkcyBtYWcgZ2VicnVpa2VuLg0KDQpNZXQgVHJpbW1vbWF0aWNQRSB3b3JkdCB0cmltbW9tYXRpYyBhYW5nZXJvZXBlbiwgdmVyZGVyIHppam4gMiBhbmRlcmUgYmVsYW5nZXJpamtlIGRpbmdlbiBkZSB7IH0gaXMgb20gZGUgdHJpbW1vbWF0aWMgdGUgYXV0b21hdGlzZXJlbiBkaXQgZG9ldCBoaWogZG9vciBhbGxlIGZpbGVzIGluIGRlIG1hcCBmYXN0cSB0ZSBuZW1lbiBkaWUgZWluZGlnZW4gbWV0IC5mYXN0cS5neiBlbiBkZSBvdXRwdXQgdmFuIHRyaW1tb21hdGljIG5hYXIgZGUgZmFzdHEtdHJpbW1lZCBtYXAgdGUgemV0dGVuLg0KDQpIZXQgYW5kZXJlIGJlbGFuZ3JpamtlIGlzIGRlIE1JTkxFTiBlbiBTbGlkaW5nd2luZG93IGNvbW1hbmRvJ3MuIE1pbmxlbiBsYWF0IGRlIHJlYWRzIHZhbGxlbiB3YW5uZWVyIGhldCBvbmRlciBlZW4gYmVwYWFsZGUgbGVuZ3RlIGlzLg0KDQpTbGlkaW5nd2luZG93IGhldCB6b3JndCBlcnZvb3IgZGF0IHRyaW1tb21hdGljIHNuaWpkdCB6b2RyYSBkZSBnZW1pZGRlbGRlIGt3YWxpdGVpdCBiaW5uZW4gaGV0IHZlbnN0ZXIgb25kZXIgZWVuIGRyZW1wZWx3YWFyZGUga29tdC4NCg0KRXIgemlqbiBvb2sgZWVuIHBhYXIgc2FtcGxlcyBuaWV0IGdlYnJ1aWt0LiBEaXQgemlqbiBkZTogQjIyMCtDRDQzK0lnTS0gc29ydGVkIHByaW1hcnkgcHJvLUIgY2VsbHMuIERlemUgc2FtcGxlcyB6aWpuIHZlcmtyZWdlbiBtZXQgZWVuIGlsbHVtaW5hIE1pU2VxLg0KDQpTU1IyNjk4MDUyN1wNClNTUjI2OTgwNTI4XA0KU1NSMjY5ODA1MjlcDQpTU1IyNjk4MDUzMA0KDQpEZSByZWRlbiBkYXQgd2UgZGV6ZSBuaWV0IGdlYnJ1aWtlbiBpcyBvbWRhdCBoZXQgc2FtcGxlcyB2YW4gV1QgbXVpemVuIHppam4sIFdlIGdhYW4gaGllciBoZXQgcmVmZXJlbnRpZWdlbm9vbSB2b29yIGdlYnJ1aWtlbi4gRGUga3dhbGl0ZWl0IHZhbiBkZXplIHNlcXVlbnRpZXMgd2FzIHZvbGdlbnMgZmFzdFFDIHZlZWwgc2xlY2h0ZXIgZGFuIGRlIG9uZGVyc3RhYW5kZSBzYW1wbGVzLiBEaXQga2FuIG1vZ2VsaWprIGtvbWVuIG9tZGF0IGRlIHJlYWRzIHRlIGxhbmcgd2FyZW4gd2FhcmRvb3IgZGUga3dhbGl0ZWl0IHNuZWwgZGFhbGRlLg0KDQpEZSB2b2xnZW5kZSBzYW1wbGVzIHppam4gd2VsIGdlYnJ1aWt0LiBEYXQgemlqbjogUHJpbWFyeSBwcm8tQiBjZWxscyBieSBDRDE5KyBzZWxlY3Rpb24gKFJBZzItLy0pIERlemUgc2EscGxlcyB6aWpuIHZlcmtyZWdlbiBtZXQgZWVuIGlsbHVtaW5hIE5vdmFTZXEgNjAwMA0KDQpTUlIyNjk4MDU0OS5zYW1cDQpTUlIyNjk4MDU1MC5zYW1cDQpTUlIyNjk4MDU1MS5zYW1cDQpTUlIyNjk4MDU1Mi5zYW0NCg0KRGUgc2FtcGxlcyBkaWUgb25ub2RpZyB3YXJlbiB6aWpuIG9vayB2ZXJ3aWpkZXJkIHVpdCBkZSBTcmFBY2NMaXN0LmNzdiBvbWRhdCBkZXplIG1ldCBkZSBwaXBlIG9wZXJhdG9yIGludGVydmVyZW4sIGRpdCBrYW4gdm9vciBwcm9ibGVtZW4gem9yZ2VuIG9mIG92ZXJib2RpZ2UgYmVsYXN0aW5nLg0KDQpWb29yIGRpZXBlcmUgYW5hbHlzZSBjaGVjayBoZXQgbG9nYm9layB2YW4gU3Rvcm0gZW4gSXZhcg0KDQoqKkZsb3cgY2hhcnQgdm9vciBQYWlyZWQgRW5kIG1vZGUuKioNCg0KWyFbRmlndXVyIDQgOiBGbG93IG9mIHJlYWRzIGluIFRyaW1tb21hdGljIC0gUGFpcmVkIEVuZCBtb2RlXShpbWFnZXMvY2xpcGJvYXJkLTUyNDEzNDEzMi5wbmcpXShodHRwOi8vd3d3LnVzYWRlbGxhYi5vcmcvY21zL3VwbG9hZHMvc3VwcGxlbWVudGFyeS9UcmltbW9tYXRpYy9UcmltbW9tYXRpY01hbnVhbF9WMC4zMi5wZGYpDQoNCkRlemUgZmxvd2NoYXJ0IHRvb250IGhvZSBUcmltbW9tYXRpYyBwYWlyZWQtZW5kIHJlYWRzIHZlcndlcmt0LiBIZXQgcHJvZ3JhbW1hIG5lZW10IGJlaWRlIHJlYWRzIGFscyBpbnB1dCBlbiBiZW9vcmRlZWx0IGh1biBrd2FsaXRlaXQuIEFscyB6b3dlbCBkZSBmb3J3YXJkIGFscyByZXZlcnNlIHJlYWRzIHZvbGRvZW4gYWFuIGRlIGdla296ZW4gc2V0dGluZ3MsIGJsaWp2ZW4gemUgInBhaXJlZCIgdm9vciB2ZXJkZXJlIGFuYWx5c2UuIEFscyDDqcOpbiB2YW4gZGUgdHdlZSBuaWV0IGFhbiBkZSBrd2FsaXRlaXRzbm9ybWVuIHZvbGRvZXQgd29yZHQgZGUgc2xlY2h0ZSByZWFkIHZlcndpamRlcmQgZW4gZGUgZ29lZGUgcmVhZCBhbHMgInVucGFpcmVkIiBvcGdlc2xhZ2VuLiBIaWVyZG9vciBvbnN0YWFuIHZpZXIgbW9nZWxpamtoZWRlbiB2b29yIG91dHB1dHM6IGZvcndhcmQgcGFpcmVkLCByZXZlcnNlIHBhaXJlZCwgZm9yd2FyZCB1bnBhaXJlZCBlbiByZXZlcnNlIHVucGFpcmVkLiBBbGxlbWFhbCBhZmhhbmtlbGlqayB2YW4gZGUga3dhbGl0ZWl0IHZhbiBlbGtlIHJlYWQuDQoNCiMjIyBGYXN0cWMgcnVuIDINCg0KRGV6ZSB0d2VlZGUgRmFzdFFDIHJ1biBpcyBnZWRhYW4gbmEgaGV0IG1hcHBlbiB2YW4gZGUgZGF0YS4NCg0KIVtGaWd1dXIgNTogbXVsdGlRQyB2aWV3IHZhbiBmYXN0cSBmaWxlcyBuYSBUcmltbW9tYXRpY10oaW1hZ2VzL211bHRpcWNfdHJpbWRfc2VxX3F1YWxpdHkuUE5HKQ0KDQpIaWVyIGlzIGRlIGRhdGEgdGUgemllbiBuYWRhdCBkZXplIGdldHJpbW1lZCBpcywgZXIgemlqbiBlZW4gcGFhciBkaW5nZW4gdmVyYW5kZXJkOiBXZSBoZWJiZW4gbm9nIG1hYXIgOCBmaWxlcyB2YW4gb25nZXZlZXIgMTUwIGJwIGxhbmcuDQoNCioqQ29uY2x1c2llIEZhc3RRQyBydW4gMioqDQoNCkRlIGNvbmNsdXNpZSB2YW4gZGUgZmFzdHFjIHJhcHBvcnQgaXMgZGF0IGRlIHNhbXBsZXMgNTQ5LCA1NTAsIDU1MSwgNTUxIGdvZWQgemlqbiBvcCBoZXQgZ2ViaWVkIHZhbiBkZSBhbGdlbWVuZSBzZXF1ZW50aWUga3dhbGl0ZWl0LiBBbGxlZW4gZGV6ZSBzYW1wbGVzIGxhdGVuIGVlbiBhYW50YWwgYmlqem9uZGVyaGVkZW4gemllbiBkaWUgd2UgbmlldCBoZWxlbWFhbCBrdW5uZW4gdmVya2xhcmVuLCBtYWFyIGhvb2dzdHdhYXJzY2hpam5saWprIG5pZXQgZXJuc3RpZyBnZW5vZWcgemlqbiBvbSBkZSB2ZXJkZXJlIHN0YXBwZW4gdGUga3VubmVuIGJlaW52bG9lZGVuLg0KDQpWb29yIHZlcmRlcmUgYW5hbHlzZSB6aWUgbG9nYm9layB2YW4gSXZhciBvZiBTdG9ybQ0KDQojIyMgQWxpZ24gZGF0YQ0KDQoqKlNvcnRlcmVuIC5zYW0gYmVzdGFuZGVuKioNCg0KIyMjIEJ3YS1tZW0yDQoNCkJXQS1NRU0yIHdvcmR0IGdlYnJ1aWt0IG9tIHpvd2VsIEROQS0gYWxzIFJOQS1yZWFkcyB0ZSBhbGlnbmVyZW4gbWV0IGVlbiByZWZlcmVudGllZ2Vub29tLiBIZXQga2FuIGtvcnRlIGVuIG1pZGRlbGxhbmdlIEROQS0gb2YgUk5BLXJlYWRzIGFsaWduZW4uIEVyIHppam4gdmVyc2NoaWxsZW5kZSBtYW5pZXJlbiB3YWFyIGRpdCB2b29yIGdlYnJ1aWt0IGthbiB3b3JkZW4gem9hbHMsIFdob2xlIGdlbm9tZSBzZXF1ZW5jaW5nLCBFeG9vbXNlcXVlbmNpbmcgZW4gUk5BLXNlcS4gVm9vciBvbnMgaXMgV2hvbGUgZ2Vub21lIHNlcXVlbmNpbmcgaW50ZXJyZXNhbnQgZGl0IGlzIG9tZGF0IGhpZXJiaWogZGUgZ2Vub21lbiB3b3JkZW4gZ2VzY2FuZCBlbiBkYW4gdmVyZ2VsZWtlbiBtZXQgaGV0IGdla296ZW4gcmVmZXJlbnRpZSBnZW5vb20gKGluIG9ucyBnZXZhbCBtbTM5IC0gR0NGXzAwMDAwMTYzNS4yNykgZGl0IG9tIGdlbmV0aXNjaGUgdmFyaWF0aWVzIHRlIGlkZW50aWZpY2VyZW4uDQoNCkJXQS1NRU0yIGhlZWZ0IGVlbiBnZcOvbmRleGVlcmRlIHZlcnNpZSBub2RpZyB2YW4gb25zIHJlZmVyZW50aWUgZ2Vub29tLCBkZXplIG1vZXQgZHVzIGVlcnN0IGdlbWFha3Qgd29yZGVuLiBEaXQga2FuIGdlZGFhbiB3b3JkZW4gbWV0IGJ3YS1tZW0yIGluZGV4LCBub2cgZWVuIHBsdXMgcHVudCBpcyBoZXQgaW5kZXhlcmVuIG1hYWt0IGhldCBhbGlnbiBwcm9jZXMgdmVlbCBzbmVsbGVyLiBEZSBzYW1wbGVzIFNSUjI2OTgwNTI4XzEgZW4gXF8yIHppam4gZ2VicnVpa3QgbmEgaGV0IHJlZmVyZW50aWVnZW5vb20gdGUgaW5kZXhlcmVuLiBIZXQgZ2VicnVpa3RlIHJlZmVyZW50aWUgZ2Vub29tIGlzIG1tMzkgLSBHQ0ZfMDAwMDAxNjM1LjI3IGluIG9ucyBnZXZhbCBoZWV0IGRlemUgZmlsZSAidGVzdG5hYW0iDQoNCipEZXplIGNvZGUgaXMgZ2VzY2hyZXZlbiBkb29yIEZsb3JpcyBkZXplIGlzIHRlIHZpbmRlbiBpbiB6aWpuIGxvZ2JvZWsgLSBEZXplIGNvZGUgaXMgdm9vciBkZSBhbGlnbmluZyB2YW4gZGUgZGF0YS4qDQoNCkVlcnN0IGlzIGNhdCB0ZSB6aWVuIG9vayB3ZWwgY29uY2F0ZW5hdGUgZGl0IHJlYWQgZGUgZmlsZSBlbiBwcmludCB6aWpuIGNvbnRlbnQsIGRhbiBpcyBwYXJhbGxlbCB0ZSB6aWVuIGRlemUgcnVudCBkZSB3b3JrbG9hZCBvdmVyIG1lZXJkZXJlIGNvcmVzLiBEYW4gaXMgdGUgemllbiBkYXQgd2UgZWVuIHBhdGggYWFuZ2V2ZW4gc3BlY2lmaWVrIG5hYXIgYndhLW1lbTIgb21kYXQgZGV6ZSBpcyBnZWluc3RhbGxlZXJkIGluIGRlemUgc3BlaWNpZmlla2UgbWFwLCBtZXQgbWVtIHJvZXBlbiB3ZSBkZSBhbGxpZ25tZW50IG1vZHVzIGFhbiB3ZWxrZSBid2EgbW9ldCBnZWJydWlrZW4gZGV6ZSBtb2R1cyBpcyBnb2VkIHZvb3IgcmVhZHMgZGllIGRvb3IgaWxsdW1pbmEgbWFjaGluZXMgemlqbiBnZXNlcXVlbmNlZC4gSGV0IHZvbGdlbmRlIHdhdCB0ZSB6aWVuIGlzIGlzIGVlbiAtdCA1MCBkaXQgZ2VlZnQgYWFuIGhvZXZlZWwgdGhyZWFkcyBid2EgbW9ldCBnZWJydWlrZW4sIHRlc3RuYWFtIHJlZmVyZWVudCBuYWFyIGhldCBnZWluZGV4ZWVyZGUgcmVmZXJlbnRpZSBnZW5vb20uIERhbiB6aWpuIHdlZXIgMiBwYXRocyB0ZSB6aWVuLCBkZXplIHJlZmVyZW4gbmFhciBkZSBmb3J3YXJkIGVuIHJldmVyc2Ugc3RyYW5kcyBlbiBkZSB7fSBpcyBvbSB0ZSB6b3JnZW4gZGF0IGhldCBhbGxlIGZpbGVzIGluIGRlIG1hcCBrYW4gbGV6ZW4gem9kYXQgaGV0IGVpZ2VubGlqayBkZSBnZWhlbGUgbWFwIGF1dG9tYXRpc2NoIGRvZXQuIERlIGxhYXRzdCBwYXRoIGlzIHZvb3IgZGUgb3V0cHV0IGVuIGRlIGxhYXRzdGUgY2hhcmFjdGVyICImIiBpcyB6b2RhdCBkaXQgb3AgZGUgYWNodGVyZ3JvbmQgZ2ViZXVyZC4NCg0KYGBge2Jhc2gsIGV2YWw9RkFMU0V9DQpjYXQgL3N0dWRlbnRzLzIwMjQtMjAyNS9UaGVtYTA1LzNkY29uZm9ybWF0aWVDaHJvbWF0aW5lL1NSQS9TcmFBY2NMaXN0LmNzdiB8IHBhcmFsbGVsIC9zdHVkZW50cy8yMDI0LTIwMjUvVGhlbWEwNS8zZGNvbmZvcm1hdGllQ2hyb21hdGluZS9id2FfbWVtMi9id2EtbWVtMi0yLjIuMV94NjQtbGludXgvYndhLW1lbTIgbWVtIC10IDUwIHRlc3RuYWFtIC9zdHVkZW50cy8yMDI0LTIwMjUvVGhlbWEwNS8zZGNvbmZvcm1hdGllQ2hyb21hdGluZS9UcmltbW9tYXRpY19vdXRwdXQvcGFpcmVkL3t9X2ZvcndhcmRfcGFpcmVkLmZhc3RxIC9zdHVkZW50cy8yMDI0LTIwMjUvVGhlbWEwNS8zZGNvbmZvcm1hdGllQ2hyb21hdGluZS9UcmltbW9tYXRpY19vdXRwdXQvcGFpcmVkL3t9X3Jldl9wYWlyZWQuZmFzdHEgPiAvc3R1ZGVudHMvMjAyNC0yMDI1L1RoZW1hMDUvM2Rjb25mb3JtYXRpZUNocm9tYXRpbmUvbWFwcGluZy97fS5zYW0gJg0KDQpgYGANCg0KRGUgcmVkZW4gd2Fhcm9tIHdpaiBid2EtbWVtMiBnZWJydWlrZW4gZW4gbmlldCBTVEFSIGlzIG9tZGF0IGJ3YS1tZW0yIGJldGVyIGlzIHZvb3IgRE5BIGRpdCBpcyBvbWRhdCBTVEFSIGdlc3BlY2lhbGlzZWVyZCBpcyBpbiBSTkEtc2VxIG9vayBpcyBid2EtbWVtMiBoZWVsIGFjY3VyYWF0IHZvb3IgRE5BIHNlcXVlbmNlcyBhbGxpZ25tZW50LCBoZXQgZ2FhdCBnb2VkIG9tIG1ldCBtaXNtYXRjaGVzLCBrbGVpbmUgaW5kZWxzIGVuIGxhbmdlcmUgcmVhZHMuIEhldCB2b29yZGVlbCB2YW4gYndhLW1lbTIgaXMgb29rIGRhdCBoZXQgbWluZGVyIHp3YWFyIGlzIG9wIGRlIG1lbW9yeSB2YW4gZGUgcGMncy4NCg0KIyMjIENvbnZlcnRlZXIgU0FNIG5hYXIgQkFNDQoNCmBgYHtiYXNoLCBldmFsPUZBTFNFfQ0Kc2FtdG9vbHMgc29ydCAtbiAtTyBCQU0gLW8gYWxpZ25lZF9zb3J0ZWRfU1JSMjY5ODA1NDkuYmFtIGFsaWduZWRfU1JSMjY5ODA1NDkuc2FtDQoNCiMgTWV0IHBhcmFsbGVsOg0KY2F0IC9zdHVkZW50cy8yMDI0LTIwMjUvVGhlbWEwNS8zZGNvbmZvcm1hdGllQ2hyb21hdGluZS9TUkEvU3JhQWNjTGlzdC5jc3YgfCBwYXJhbGxlbCBzYW10b29scyBzb3J0IC1uIC1PIEJBTSAtbyBhbGlnbmVkX3NvcnRlZF97fS5iYW0gYWxpZ25lZF97fS5zYW0gICYNCg0KYGBgDQoNCk9uZGFua3MgZGF0IGRlIC5iYW0gZWVyc3Qgc3RhYXQgZW4gZGFuIGRlIC5zYW0gd29yZGVuIGRlIHNhbSBmaWxlcyBuYWFyIGJhbSBvbWdlemV0Lg0KDQpjYXQgL3N0dWRlbnRzLzIwMjQtMjAyNS9UaGVtYTA1LzNkY29uZm9ybWF0aWVDaHJvbWF0aW5lL1NSQS9TcmFBY2NMaXN0LmNzdiwgbGVlc3QgZGUgbGlqc3QgdmFuIHNhbXBsZS1uYW1lbiB1aXQgaGV0IFNyYUFjY0xpc3QgQ1NWIGJlc3RhbmQsIGRpdCBiZXN0YW5kIGJldmF0IGRlIGFjY2Vzc2llbnVtbWVycyBiaWp2b29yYmVlbGQgU1JSMjY5ODA1NTAuDQoNCnNhbXRvb2xzIHNvcnQgLW4gLU8gQkFNIC1vIGFsaWduZWRfc29ydGVkXF97fS5iYW0gYWxpZ25lZFxfe30uc2FtOiBkaXQgaXMgaGV0IHNvcnRlZXIgY29tbWFuZG8gd2F0IHVpdGdldm9lcmQgd29yZHQsIGlkIGRlIHBhcmFsbGVsIHN0YWFuIGlucGxhYXRzIHZhbiBkZSBiZXN0YW5kIG5hbWVuIGFsbGVlbiBkZSB7fSBlbiBkZSBmaWxlIHR5cGUgaW4gZGl0IGdldmFsIC5iYW0gJiAuc2FtLiBEaXQgem9yZ3QgZGF0IHNhbXRvb2xzIGtpamt0IGluIGRlIG1hcCB3YWFyIGhldCB1aXRnZXZvZXJkIHdvcmR0IGVyIGdlem9jaHQgbmFhciBhbGxlZW4gYmVzdGFuZGVuIGRpZSB2b2xkb2VuIGFhbiBkZSBmaWx0ZXIgZWlzZW4gZHVzIGlldHMgd2FhciAiYWxpZ25lZF9zb3J0ZWRcXyIgaW4gc3RhYXQsIGRhbiBkZSB7fSBkdXMgZGUgc2FtcGxlIG5hYW0gd2FhcnNjaGlqbmxpamsgZW4gZGFuIGRlIC5iYW0gYWZrb3J0aW5nLg0KDQomLCBkaXQgem9yZ3QgZXJ2b29yIGRhdCBoZXQgc2NyaXB0IG9wIGRlIGFjaHRlcmdyb25kIGdlcnVuZCB3b3JkIHdhYXJkb29yIGVyIHZlcmRlciBnZXdlcmt0IGthbiB3b3JkZW4gdGVyd2lqbCBkaXQgc2NyaXB0IHJ1bnQuDQoNCkRlIHJlZGVuIG9tIGRlIGFsaWduZWQgZmlsZXMgb20gdGUgemV0dGVuIHZhbiAuc2FtIG5hYXIgLmJhbSBpcyBvbWRhdCBkZXplIHdvcmRlbiBnZWJydWlrdCBvbSBlZW4gYmVkIGZpbGUgdGUgbWFrZW4uIE9vayB6aWpuIGVyIHZvb3JkZWxlbiBhYW4gYmFtIGJlc3RhbmRlbiB0ZWdlbm92ZXIgc2FtIGJlc3RhbmRlbiBkaXQgemlqbjogbWluZGVyIG9wc2xhZ3J1aW10ZSwgbWVlciBjb21wYXRpYmlsaXRlaXQgZW4gc25lbGxlciBsZWVzIGJhYXIgZG9vciB2ZXJzY2hpbGxlbmRlIHRvb2xzLg0KDQojIyMgRnJlZWJheWVzIC0gdmFyaWFudCBjYWxsaW5nDQoNCkBCaW9pbmZvcm1hdGljc1dvcmtib29rDQoNCkZyZWViYXllcyBpcyBlZW4gIkJheWVzaWFuIiBnZW5ldGlzY2hlIHZhcmlhbnQgZGV0ZWN0b3IgZ2VtYWFrdCBvbSBrbGVpbmUgInBveWxtb3JwaGlzbXMiIChkZSBhYW53ZXppZ2hlaWQgdmFuIHR3ZWUgb2YgbWVlciB2YXJpYW50ZW4gdmFuIGVlbiBzcGVjaWZpZWtlIEROQS1zZXF1ZW50aWUpLCBpbiBoZXQgc3BlY2lmaWVrIFNOUHMgKHNpbmdsZS1udWNsZW90aWRlIHBvbHltb3JwaGlzbXMpLCBpbmRlbHMgKGluc2Vyc3RpZXMgZW4gdmVyd2lqZGVyaW5nZW4pLCBNTlBzIChtdWx0aS1udWNsZW90aWRlIHBvbHltb3JwaGlzbXMpLCBlbiBjb21wbGV4ZSBldmVuZW1lbnRlbiAoY29tcG9zaXRlIGluc2VydGlvbiBhbmQgc3Vic3RpdHV0aW9uIGV2ZW50cykga2xlaW5lciBkYW4gZGUgbGVuZ2h0ZSB2YW4gZWVuIHNob3J0LXJlZCBzZXF1ZW5jaW5nIGFsaWdubWVudC4NCg0KZnJlZWJheWVzIGlzIGhhcGxvdHlwZS1nZWJhc2VlcmQsIGluIGRlIG1hbmllciB3YWFyb3AgaGV0IHZhcmlhbnRlbiBjYWxsZWQgZ2ViYXNlZXJkIG9wIGRlIGxldGVybGlqa2Ugc2VxdWVudGllcyB2YW4gcmVhZHMgZ2UgYWxpZ25lZCBuYWFyIGVlbiBzcGVjaWZpZWtlIHRhcmdldCwgbmlldCBodW4gZXhhY3RlIGFsaWdubWVudC4gRGl0IG1vZGVsIGlzIGVlbiBlZW52b3VkaWdlIGdlbmVyYWxpc2F0aWUgdmFuIGVlcmRlcmUgbW9kZWxsZW4gKGJpanYuIFBvbHlCYXllcywgc2FtdG9vbHMsIEdBVEspIGRpZSB2YXJpYW50ZW4gZGV0ZWN0ZXJlbiBvZiByYXBwb3J0ZXJlbiBvcCBiYXNpcyB2YW4gYWxpZ25tZW50cy4gRGV6ZSBtZXRob2RlIHZlcm1pamR0IGVlbiB2YW4gZGUga2VybnByb2JsZW1lbiBtZXQgYWxpZ25tZW50LWJhc2VkIHZhcmlhbnQgZGV0ZWN0aW9uLS0tIGRhdCBpZGVudGlla2Ugc2VxdWVudGllcyBtZWVyZGVyZSBtb2dlbGlqa2UgYWxpZ25tZW50cyBrdW5uZW4gaGViYmVuLg0KDQpWb29yZGF0IGRlIGZyZWViYXllcyBlY2h0IGJlemlnIGthbiBtb2V0ZW4gZXIgbm9nIHdlbCBlZW4gcGFhciBiZXN0YW5kZW4gYWFuZ2VwYXN0IHdvcmRlbi4NCg0KYGBge2Jhc2gsIGV2YWw9RkFMU0V9DQovc3R1ZGVudHMvMjAyNC0yMDI1L1RoZW1hMDUvM2Rjb25mb3JtYXRpZUNocm9tYXRpbmUvZnJlZWJheWVzL2ZyZWViYXllcy0xLjMuNi1saW51eC1hbWQ2NC1zdGF0aWMgLWYgR0NBXzAwMDAwMTYzNS45X0dSQ20zOV9nZW5vbWljLmZuYSBcIC9zdHVkZW50cy8yMDI0LTIwMjUvVGhlbWEwNS8zZGNvbmZvcm1hdGllQ2hyb21hdGluZS9hbGlnbmVkX3NvcnRlZF9TUlIyNjk4MDU0OS5iYW0gPiBcIA0KL3N0dWRlbnRzLzIwMjQtMjAyNS9UaGVtYTA1LzNkY29uZm9ybWF0aWVDaHJvbWF0aW5lL3ZhcmlhbnRfY2FsbGluZy9TUlIyNjk4MDU0OV90ZXN0LnZjZg0KYGBgDQoNCkRlIGNvZGUgaGllciBhY3RpdmVlcnQgZWVyc3QgZGUgZnJlZWJheWVzIGRvb3IgbmFhciBoZXQgcGF0aCB0ZSBnYWFuIHdhYXIgZnJlZWJheWVzIGlzIGdlaW5zdGFsbGVlcmQgZW4gZGV6ZSBhYW4gdGUgcm9lcGVuLCAtZiBnZWVmdCBhYW4gd2VsayByZWZlcmVudGllIGdlbm9vbSBmcmVlYmF5ZXMgbW9ldCBnZWJydWlrZW4gd2lqIGxpbmtlbiBoaWVyIG5hYXIgaGV0IEdDQV8wMDAwMDE2MzUuOV9HUkNtMzlfZ2Vub21pYy5mbmEgcmVmIGdlbm9vbSB3YXQgZGUgbTM5IHZlcnNpZSBpcyB2YW4gaGV0IG11aXMgZ2Vub29tLiBEYWFybmEgZ2FhbiB3ZSBuYWFyIGhldCBhbGlnbmVkX3NvcnRlZF9TUlIyNjk4MDU0OS5iYW0gZmlsZSwgZGV6ZSBmaWxlIGlzIGRlIGdlIGFsaWduZWVyZGUgc2VxdWVuY2UgZmlsZS4NCg0KYGBge2Jhc2gsIGV2YWw9RkFMU0V9DQpzYW10b29scyBmYWlkeCBHQ0FfMDAwMDAxNjM1LjlfR1JDbTM5X2dlbm9taWMuZm5hIA0KYGBgDQoNCkZhaWR4LCBkaXQgaXMgZWVuIGNvbW1hbmRvIHZhbiBzYW10b29scyBkYXQgZ2VicnVpa3Qgd29yZHQgb20gZWVuIEZBU1RBLWluZGV4IHRlIGdlbmVyZW4gdm9vciBoZXQgcmVmZXJlbnRpZWdlbm9vbSBpbiBGQVNUQS1mb3JtYWF0DQoNCkdDQV8wMDAwMDE2MzUuOV9HUkNtMzlfZ2Vub21pYy5mbmEgaXMgaGV0IHJlZmVyZW50aWUgZ2Vub29tIGluIGZhc3RhIGZvcm1hYXQgd2FhciBkZSBpbmRleGVyaW5nIG9wIHdvcmR0IHRvZWdlcGFzdC4NCg0KRWVuIC5mYWkgYmVzdGFuZCBiZXZhdCBpbmZvIG92ZXIgZGUgdm9sZ29yZGUgdmFuIGRlIHNlcXVlbnRpZXMgaW4gaGV0IEZBU1RBLWJlc3RhbmQsIHpvYWxzIGRlIG5hbWVuIHZhbiBkZSBjaHJvbW9zb21lbiwgZGUgbGVuZ3RlIHZhbiBkZSBzZXF1ZW50aWVzIGVuIHdhYXIgZGV6ZSB6aWNoIGJldmluZGVuIGluIGhldCBiZXN0YW5kLiBkaXQgbWFha3Qgc25lbGxlIHRvZWdhbmcgdG8gc3BlY2lmaWVrZSBjaHJvbW9zb21lbiBvZiBzZXF1ZW50aWVzIG1vZ2VsaWprIHpvbmRlciBoZXQgaGVsZSBmYXN0YSBiZXN0YW5kIGluIGhldCBnZWhldWdlbiB0ZSBob2V2ZW4gbGFkZW4uDQoNCmhpZXIgZWVuIHZvb3JiZWVsZCB2YW4gaG9lIGhldCBlciB1aXQgem91IGt1bm5lbiB6aWVuLg0KDQpjaHIxIDE5NTQ3MTk3NCA1MiA2MCA2MQ0KDQpjaHIxIDE5NTQ3MTk3MSA1MiA2MCA2MQ0KDQpEZSByZWRlbiBvbSBkaXQgYmVzdGFuZCB0ZSBtYWtlbiBpcyB2b29yIG5vb2R6YWFrIGJpaiBiZXBhYWxkZSB0b29scyBkb3duIHN0cmVhbS4NCg0KIyMgV2VlayA0IC0gVmlzdWFsaXNhdGllDQoNCiMjIyBBbm5vdGF0aWUNCg0KKipHZW4gYW5ub3RhdGllKiogRWVyc3QgaXMgZXIgZWVuIC5iZWQgYmVzdGFuZCB2YW4gaGV0IG5pZXQgZG9vciBtZW5zZW4gbGVlc2JhcmUgLmJhbSBiZXN0YW5kIGdlbWFha3QsIGRhYXJuYSB6aWpuIGRlIGdlbmVuIGdlYW5ub3RlZXJkIHpvZGF0IHplIGdlZW4gbmFtZW4gaGViYmVuIHpvYWxzOiBTUlIyNjk4MDU0OS40NjI2MzE1Mi8yIG1hYXIgLi4uLiBNZXQgYmVodWxwIHZhbiBiYW1Ub0JlZCB3b3JkdCBoZXQgLmJhbSBiZXN0YW5kIG9tZ2V6ZXQgbmFhciBlZW4gLmJlZCAoQnJvd3NlciBleHRlbnNpYmxlIGRhdGEpLiBEZSBlZXJzdGUga29sb20gdmFuIGVlbiAuYmVkIGJldmF0IGRlIG5hYW0gdmFuIGhldCBjaHJvbW9zb29tLCBkZSB0d2VlZGUga29sb20gaGV0IHN0YXJ0IGNvw7ZyZGluYWF0IHZhbiBkZSBmZWF0dXJlLCBkZSBkZXJkZSBrb2xvbSBoZXQgZWluZCBjb8O2cmRpbmFhdCB2YW4gZGUgZmVhdHVyZSwgNGUga29sb20gZGUgbmFhbSwgZGFhcm5hIG9wdGlvbmVlbCBlZW4gc2NvcmUgZW4gZGFuIGRlIHN0cmVuZyAoLS8rKS4gYnJvbjogPGh0dHBzOi8vZ2Vub21lLnVjc2MuZWR1L0ZBUS9GQVFmb3JtYXQuaHRtbD4NCg0KYGBge2Jhc2gsIGV2YWw9RkFMU0V9DQoNCmJhbVRvQmVkIC1pIGFsaWduZWRfc29ydGVkX1NSUjI2OTgwNTQ5LmJhbSA+IGFsaWduZWRfc29ydGVkX1NSUjI2OTgwNTQ5LmJlZA0KDQpgYGANCg0KIyMjIyANCg0KIyMjIFZpc3VhbGlzYXRpZQ0KDQp2ZXJzY2hpbGxlbmRlIHNvb3J0ZW4gdmlzdWFsaXNhdGllIHByb2JlcmVuDQoNCmBgYHtyfQ0KI2hpZXIgdnJhYWcgaWsgb2YgQmlvY21hbmFuZ2VyIGFsIGlzIGdlaW5zdGFsZWVyZCBlbiBvZiBoZXQgbm9kaWcgaXMgem8gamEgZGFuIHdvcmR0IGhldCBnZWluc3RhbGxlZXJkIG1ldCBkZSBxdWl0bHk9VFJVRSB3b3JkdCBkaXQgb3AgZGUgYWNodGVyZ3JvbmQgZ2VkYWFuLg0KaWYgKCFyZXF1aXJlKCJCaW9jTWFuYWdlciIsIHF1aWV0bHkgPSBUUlVFKSkNCiAgICBpbnN0YWxsLnBhY2thZ2VzKCJCaW9jTWFuYWdlciIpDQojaGllciBnZWJydWlrIGlrIEJpb2NNYW5hZ2VyIG9tIFZhcmlhbnRhbm5vdGF0aW9uIHRlIGluc3RhbGVyZW4NCkJpb2NNYW5hZ2VyOjppbnN0YWxsKCJWYXJpYW50QW5ub3RhdGlvbiIpDQpgYGANCg0KVmFyaWFudEFubm90YXRpb24gaXMgZWVuIGxpYnJhcnkgZGllIGtpamt0IG5hYXIgVkNGIGZpbGVzIGVuIGVyIGJlcGFhbGRlIGRpbmdlbiB1aXQga2FuIGxlemVuIGRpZSB0ZSBtYWtlbiBoZWJiZW4gbWV0IFZhcmlhbnRlbi4gRGl0IHdvcmR0IGdlaG9zdCBkb29yIEJpb2NvZHVjdG9yIDxodHRwczovL2Jpb2NvbmR1Y3Rvci5vcmcvcGFja2FnZXMvcmVsZWFzZS9iaW9jL2h0bWwvVmFyaWFudEFubm90YXRpb24uaHRtbD4gZXIgc3RhYXQgZWVuIGtvcnQgbWFhciBrcmFjaHRpZ2UgdWl0bGVnIHZhbiB3YXQgaGV0IGthbjogQW5ub3RhdGVyaW5nIHZhbiB2YXJpYW50ZW4sIGNvbXB1dGVlcnQgYW1pbm8genV1ciBjb2RlcmluZyB2ZXJhbmRlcmlvbmdlbiwgdm9vcnNwZWxsaW5nIHVpdGtvbXN0IHZhbiBjb2RlcmluZy4NCg0KYGBge3IsIH0NCiNoaWVyIHdvcmR0IGRlIGVlcmRlciBnZWluc3RhbGVlcmRlIFZhcmlhbm5vdGF0aWUgbGlicmFyeSBhYW5nZXJvZXBlbg0KbGlicmFyeShWYXJpYW50QW5ub3RhdGlvbikNCg0KI2hpZXIgd29yZGVuIGRlIDQgZmlsZXMgaW4gZWVuIHZhcmlhYmVsZSBnZXpldCBtZXQgZGUgc2FtcGxlIGNvZGUNCnZjZl9maWxlXzU1MiA8LSAiL1VzZXJzL0dlYnJ1aWtlci9EZXNrdG9wL2RhdGFfZ2Vub21pY3NfU1JSL2Fubm90YXRlZF9TUlIyNjk4MDU1Mi52Y2YiDQp2Y2ZfZmlsZV81NTEgPC0gIi9Vc2Vycy9HZWJydWlrZXIvRGVza3RvcC9kYXRhX2dlbm9taWNzX1NSUi9hbm5vdGF0ZWRfU1JSMjY5ODA1NTEudmNmIg0KdmNmX2ZpbGVfNTUwIDwtICIvVXNlcnMvR2VicnVpa2VyL0Rlc2t0b3AvZGF0YV9nZW5vbWljc19TUlIvYW5ub3RhdGVkX1NSUjI2OTgwNTUwLnZjZiINCnZjZl9maWxlXzU0OSA8LSAiL1VzZXJzL0dlYnJ1aWtlci9EZXNrdG9wL2RhdGFfZ2Vub21pY3NfU1JSL2Fubm90YXRlZF9TUlIyNjk4MDU0OS52Y2YiDQoNCiNoaWVyIHdvcmRlbiBkZSA0IGZpbGVzIG1ldCByZWFkVkNGIGdlbGV6ZW4gbWV0IGhldCBiaWpiZWhvcmVuZGUgcmVmcmVuY2UgZ2Vub29tIG9vayB3ZWwgZGUgR1JDbTM5IG11aXMgaGV0IG5pZXV3c3RlIG11aXNnZW5vb20gZW4gZGV6ZSB3b3JkZW4gaW4gZWVuIG5pZXV3ZSB2YXJhaWJsZSBnZXpldC4NCnZjZl9kYXRhX2ZpbGVfNTUyIDwtIHJlYWRWY2YodmNmX2ZpbGVfNTUyLCBnZW5vbWU9IkdSQ20zOSIpDQp2Y2ZfZGF0YV9maWxlXzU1MSA8LSByZWFkVmNmKHZjZl9maWxlXzU1MSwgZ2Vub21lPSJHUkNtMzkiKQ0KdmNmX2RhdGFfZmlsZV81NTAgPC0gcmVhZFZjZih2Y2ZfZmlsZV81NTAsIGdlbm9tZT0iR1JDbTM5IikNCnZjZl9kYXRhX2ZpbGVfNTQ5IDwtIHJlYWRWY2YodmNmX2ZpbGVfNTQ5LCBnZW5vbWU9IkdSQ20zOSIpDQoNCmhlYWQNCmBgYA0KDQpgYGB7ciwgRmlndXV1ciA2On0NCiNEaXQgem9yZ3QgZXJ2b29yIGRhdCBkZSA0IGJhcnBsb3RzIGluIDEgcGxhYXRqZSB3ZWVyZ2VnZXZlbiB3b3JkZW4NCnBhcihtZnJvdz1jKDIsMikpDQoNCiNIaWVyIGtpamsgaWsgbWV0IGRlIElORk8gY29tbWFuZG8gbmFhciB3YXQgZGUgZGF0YSBmaWxlIGJldmF0IGVuIG1ldCBkZSAkVFlQRSBhbGxlZW4gbmFhciB3YXQgdm9vciB0eXBlIHZhcmlhbnQgZGl0IGlzLiBvbmRlciBpcyB0ZSB6aWVuIGhvZSBkaXQgZXIgdWl0IHppZXQuIERhYXJuYSB3b3JkdCBoZXQgaW4gZWVuIHZhcmlhYmVsZSBnZXpldCB3YXQgZGFuIHdlZXIgb21nZXpldCB3b3JkdCBpbiBlZW4gdGFiZWwgem9kYXQgaGV0IGluIGVlbiBiYXJwbG90IGdlemV0IGthbiB3b3JkZW4uDQp2YXJpYW50X3R5cGUgPC0gaW5mbyh2Y2ZfZGF0YV9maWxlXzU1MikkVFlQRQ0KdmFyaWFudF90eXBlX2NvdW50czU1MiA8LSB0YWJsZSh2YXJpYW50X3R5cGUpDQoNCiNIaWVyIHdvcmR0IGVlbiBiYXJwbG90IGdlbWFha3QgbWV0IGRlIHZhcmlhbnRlbiB0eXBlcywgeGxhYiBnZWVmdCB3ZWVyIHdhdCBlciBkZSB4IGFzIHN0YWF0LCBjb2wgZ2VlZnQgZGUgYmFycGxvdCB6aWpuIGtsZXVyIChlY2h0ZXIgd2Vya3QgaGV0IHNvbXMgbmlldCkgZW4geWxhYiBpcyB3YXQgZXIgb3AgZGUgeSBhcyBzdGFhdC4NCmJwX3ZfNTUyIDwtIGJhcnBsb3QodmFyaWFudF90eXBlX2NvdW50czU1MiwgDQogICAgICAgIG1haW4gPSAiVGVsbGluZyBWYXJpYW50IFR5cGVzIC0gc2FtcGxlIDU1MiIsDQogICAgICAgIHhsYWIgPSAiVmFyaWFudCBTb29ydCIsDQogICAgICAgIHlsYWIgPSAiVGVsbGluZyIsDQogICAgICAgIGNvbCA9ICJsaWdodGJsdWUiKQ0KDQp2YXJpYW50X3R5cGUgPC0gaW5mbyh2Y2ZfZGF0YV9maWxlXzU1MSkkVFlQRQ0KdmFyaWFudF90eXBlX2NvdW50czU1MSA8LSB0YWJsZSh2YXJpYW50X3R5cGUpDQoNCmJwX3ZfNTUxIDwtIGJhcnBsb3QodmFyaWFudF90eXBlX2NvdW50czU1MSwgDQogICAgICAgIG1haW4gPSAiVGVsbGluZyBWYXJpYW50IFR5cGVzIC0gc2FtcGxlIDU1MSIsDQogICAgICAgIHhsYWIgPSAiVmFyaWFudCBTb29ydCIsDQogICAgICAgIHlsYWIgPSAiVGVsbGluZyIsDQogICAgICAgIGNvbCA9ICJsaWdodGJsdWUiKQ0KDQp2YXJpYW50X3R5cGUgPC0gaW5mbyh2Y2ZfZGF0YV9maWxlXzU1MCkkVFlQRQ0KdmFyaWFudF90eXBlX2NvdW50czU1MCA8LSB0YWJsZSh2YXJpYW50X3R5cGUpDQoNCmJwX3ZfNTUwIDwtIGJhcnBsb3QodmFyaWFudF90eXBlX2NvdW50czU1MCwgDQogICAgICAgIG1haW4gPSAiVGVsbGluZyBWYXJpYW50IFR5cGVzIC0gc2FtcGxlIDU1MCIsDQogICAgICAgIHhsYWIgPSAiVmFyaWFudCBTb29ydCIsDQogICAgICAgIHlsYWIgPSAiVGVsbGluZyIsDQogICAgICAgIGNvbCA9ICJsaWdodGJsdWUiKQ0KDQp2YXJpYW50X3R5cGUgPC0gaW5mbyh2Y2ZfZGF0YV9maWxlXzU0OSkkVFlQRQ0KdmFyaWFudF90eXBlX2NvdW50czU0OSA8LSB0YWJsZSh2YXJpYW50X3R5cGUpDQoNCmJwX3ZfNTQ5IDwtIGJhcnBsb3QodmFyaWFudF90eXBlX2NvdW50czU0OSwgDQogICAgICAgIG1haW4gPSAiVGVsbGluZyBWYXJpYW50IFR5cGVzIC0gc2FtcGxlIDU0OSIsDQogICAgICAgIHhsYWIgPSAiVmFyaWFudCBTb29ydCIsDQogICAgICAgIHlsYWIgPSAiVGVsbGluZyIsDQogICAgICAgIGNvbCA9ICJsaWdodGJsdWUiKQ0KYGBgDQoNClVpdCBkZXplIGtvbWVuIDQgYmFycGxvdHMgZGllIG5hYXN0IGVsa2FhciB3b3JkZW4gZ2V6ZXQuIERlIGJhcnBsb3RzIGdldmVuIHBlciB0eXBlIHZhcmlhbnQgd2VlciBob2V2ZWVsIGVyIHppam4uIGVyIGlzIGluIGRlemUgYmFycGxvdHMgdGUgemllbiBkYXQgZGUgbWVlc3RlIHR5cGUgdmFyaWFudGVuIGluc2VydGllIHZhcmlhbnRlbiB6aWpuIGVuIG9wIDJkZSBwbGFhdHMgMSBudWNsZW90aWRlIHZlcmFuZGVyaW5nZW4gYmlqIGVsa2Ugc2FtcGxlLiBIZXQgdmVyc2NoaWwgdHVzc2VuIGRlIHNhbXBsZXMgaXMgd2VsIGRhdCBzYW1wbGUgNTUwIHJvbmQgODAwMCBpbnNlcnRpZSB2YXJpYW50ZW4gaGVlZnQgZW4gc2FtcGxlIDU0OSByb25kIGRlIDUwMDAgaGVlZnQuIEhldCBpcyBuaWV0IHRlIHppZW4gdWl0IGRlemUgZ3JhZmlla2VuIG9mIGRlemUgdmFyaWFudGVuIG9vayBvcCBoZXQgZXhvbiB6aXR0ZW4uDQoNCkhldCBpcyBiZWxhbmdyaWprIG9tIGRpdCB0ZSB3ZXRlbiBvbWRhdCBzb21taWdlIHZhcmlhbnRlbiBtZWVyIGltcGFjdCBoZWJiZW4gZGFuIGFuZGVyZW4uIFNOUCB2YXJpYW50ZW4ga3VubmVuIHZvb3IgZ2VlbiBlbmtlbGUgdmVyYW5kZXJpbmdlbiB6b3JnZW4gZG93bnN0cmVhbSwgb2Ygb29rIGp1aXN0IHdlbCBkb29yIGJpanZvb2JlZWxkIHZhbiBlZW4gbm9ybWFsZSBjb2RvbiBlZW4gc3RvcCBjb2RvbiB0ZSBtYWtlbiB3YWFyZG9vciBkb3duc3RyZWFtIGRlIGFtaW5venVyZW4gbmlldCBnb2VkIHdvcmRlbiBnZXRyYW5zY3JpcHRlZXJkLiBEZSBsb2NhdGllIGlzIGJlbGFuZ3Jpamsgb20gdGUgd2V0ZW4gb21kYXQgZGl0IGthbiB6ZWdnZW4gb2YgaGV0IHRlIG1ha2VuIGhlZWZ0IG1ldCBvbnplIG9uZGVyem9la3N2cmFhZy4gT20gdGVydWcgdGUga29tZW4gb3ZlciB3YWFyb20gZGV6ZSBncmFmaWVrZW4gYmVsYW5ncmlqayB6aWpuIGlzIG9tIHRlIGxhdGVuIHppZW4gZGF0IGVyIGRlZ2VsaWprIG11dGF0aWVzIGluIGRlIHZhcmlhbnRlbiB6aWpuIGVuIGRhdCBzb21taWdlIHNhbXBsZXMgdmVlbCBoZWJiZW4uDQoNCldhdCB2b29yIGluZm8geml0IGVyIGluIGluZm8odmNmX2RhdGFfZmlsZV81NTIpXCRUWVBFIENoYXJhY3Rlckxpc3Qgb2YgbGVuZ3RoIDIyNTA3MSBbWzFdXSBzbnAgW1syXV0gc25wIFtbM11dIGlucyBbWzRdXSBzbnAgW1s1XV0gc25wIFtbNl1dIHNucCBbWzddXSBkZWwgW1s4XV0gaW5zIFtbOV1dIHNucCBbWzEwXV0gc25wIC4uLiBcPDIyNTA2MSBtb3JlIGVsZW1lbnRzXD4NCg0KSGllciBpcyBlZW4gYWZrb3J0aW5nIHRlIGxlemVuLCBkZXplIGFma29ydGluZyBnZWVmdCBhYW4gd2F0IHZvb3IgdHlwZSB2YXJpYW50IGRpdCBpcy4gSGllciBvbmRlciBpcyBlZW4gdGFiZWwgdGUgemllbiBtZXQgd2Vsa2UgYWZrb3J0aW5nIHdhdCBkb2V0Lg0KDQorLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKw0KfCBTb29ydCBtdXRhdGllOiB8IEJldGVrZW5pczogICAgICAgICAgICAgICAgICAgICAgIHwgVm9vcmJlZWxkOiAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCis9PT09PT09PT09PT09PT09Kz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0rPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0rDQp8IFNOUCAgICAgICAgICAgIHwgU2luZ2xlLU51Y2xlb3RpZGUgUG9seW1vcnBoaXNtICAgfCBSZWZlcmVuY2UgPSAnQScsIFNhbXBsZSA9ICdDJyAgICAgICAgfA0KKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsNCnwgSW5zICAgICAgICAgICAgfCBJbnNlcnRpb24gICAgICAgICAgICAgICAgICAgICAgICB8IFJlZmVyZW5jZSA9ICdBJywgU2FtcGxlID0gJ0FHVCcgICAgICB8DQorLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKw0KfCBEZWwgICAgICAgICAgICB8IERlbGV0aW9uICAgICAgICAgICAgICAgICAgICAgICAgIHwgUmVmZXJlbmNlID0gJ0FDJywgU2FtcGxlID0gJ0MnICAgICAgIHwNCistLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rDQp8IE1OUCAgICAgICAgICAgIHwgTXVsdGlwbGUtbnVjbGVvdGlkZSBwb2x5bW9ycGhpc20gfCBSZWZlcmVuY2UgPSAnQVRBJywgU2FtcGxlID0gJ0dUQycgICAgfA0KKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsNCnwgTUlYRUQgICAgICAgICAgfCBNdWx0aXBsZS1udWNsZW90aWRlIGFuZCBhbiBJbkRlbCB8IFJlZmVyZW5jZSA9ICdBVEEnLCBTYW1wbGUgPSAnR1RDQUdUJyB8DQorLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKw0KDQpEZXplIHRhYmVsIGlzIGdlbWFha3QgZG9vciBmbG9yaXMgZW4ga2FuIHRlcnVnIGdldm9uZGVuIHdvcmRlbiBpbiB6aWpuIGxvZ2JvZWsuDQoNCmBgYHtyLCBGaWd1dXVyIDc6fQ0KbGlicmFyeShnZ3Bsb3QyKQ0KDQojaGllciBnZWJydWlrIGlrIHJvd3JhbmdlcyBvbSBkZSBwb3NpdGllIHZhbiBkZSB2YXJpYW50ZW4gdWl0IGRlIHZjZiBkYXRhIHRlIGtyaWpnZW4gZW4gZGFuIHN0YXJ0KCkgb20gZGUgc3RhcnQgcG9zaXRpZSBlciB1aXQgdGUgaGFsZW4uDQp2YXJpYWJsZV9wb2lzaXRpb25zIDwtIHN0YXJ0KHJvd1Jhbmdlcyh2Y2ZfZGF0YV9maWxlXzU1MikpDQoNCiNnZ3Bsb3QgZ2VicnVpayBpayBoaWVyIG9wbWVya2VsaWprIGlzIGRlIGJpbndpZHRoIGRlemUgaXMgMTAwMDAwMCBEaXQgYmV0ZWtlbnQgZGF0IGVsayBiaW4gKGJhbGtqZSkgZWVuIGJyZWVkdGUgaGVlZnQgdmFuIDEgbWlsam9lbiAoMSwwMDAsMDAwKSBwb3NpdGllcw0KZ2dwbG90KGRhdGEuZnJhbWUodmFyaWFibGVfcG9pc2l0aW9ucyksIGFlcyh4ID0gdmFyaWFibGVfcG9pc2l0aW9ucykpICsNCiAgZ2VvbV9oaXN0b2dyYW0oYmlud2lkdGggPSAxMDAwMDAwLCBmaWxsID0gInNreWJsdWUiLCBjb2xvciA9ICJibGFjayIpICsNCiAgbGFicyh0aXRsZSA9ICJEaXN0cmllYnV0aWUgdmFuIFZhcmlhbnQgUG9zaXRpb25zIiwNCiAgICAgICB4ID0gIlBvc2l0aW9uIG9wIGhldCBjaHJvbW9zb29tIiwNCiAgICAgICB5ID0gInRlbGxpbmd2YW4gVmFyaWFudGVuIikgKw0KICB0aGVtZV9taW5pbWFsKCkNCmBgYA0KDQpIaWVyIGlzIGVlbiBncmFmaWVrIHRlIHppZW4gd2FhciBkZSB2YXJpYW50IHBvc2l0aWUgd29yZHQgd2VlcmdlZ2V2ZW4gb3AgaGV0IGNocm9tb3Nvb20uIERlemUgZ3JhZmllayBpcyBlY2h0ZXIgbmlldCBnb2VkLCBkaXQgaXMgb21kYXQgYWxsZSBjaHJvbW9zb21lbiB3b3JkZW4gd2VlcmdlZ2V2ZW4gZW4gbmlldCBpZXRzIHNwZWNpZmllayB3YWFyZG9vciBqZSBlaWdlbmxpamsgYWxsZSB2YXJpYW50ZW4gemlldCBvcCBlbGsgY2hyb21vc29vbSBkb29yIGVsa2Fhci4gRXIgaXMgd2VsIGVlbiBwaWVrIHdhdCBvcG1lcmtlbGlqayBpcy4NCg0KYGBge3IsIEZpZ3V1dXIgODp9DQoNCiNoaWVyIGxlZXMgaWsgZGUgZGF0YSBvcCBlZW4gYW5kZXJlIG1hbmllciBpbiBtZXQgcmVhZC5kZWxpbSBkaXQgaXMgZWVuIHRhYi1kZWxpbWVuZXRlZCB3YXQgYmV0ZWtlbnQgZGF0IGhldCBkb29yIHRhYnMgZ2VzY2hlaWRlbiBpcywgb29rIGxlZXMgaWsgaGVtIGltIHZhbmFmIGxpam4gMTI5IG9tZGF0IGlrIGRlIGhlYWRlciB3aWwgc2tpcHBlbiBkaXQgaXMgb21kYXQgaGllciBnZWVuIGluZm8gc3RhYXQgZGllIGlrIG5vZGlnIGhlYiB2b29yIHZpc3VhbGlzYXRpZSBvb2sgd2VsIGVlbiBoZWFkZXIuIHN0cmluZ3NhZmFjdG9ycyBmYWxzZSB6b2RhdCBSIGRlIHN0cmluZ3MgYWxzIGNoYXJhY3RlcnMgbGFhdCBlbiBuaWV0IGluIGZhY3RvcnMgb20gemV0LiANCnZjZl9kYXRhXzU0OSA8LSByZWFkLmRlbGltKCIvVXNlcnMvR2VicnVpa2VyL0Rlc2t0b3AvZGF0YV9nZW5vbWljc19TUlIvYW5ub3RhdGVkX1NSUjI2OTgwNTQ5LnZjZiIsIHNraXA9MTI5ICxzdHJpbmdzQXNGYWN0b3JzID0gRkFMU0UpDQp2Y2ZfZGF0YV81NTAgPC0gcmVhZC5kZWxpbSgiL1VzZXJzL0dlYnJ1aWtlci9EZXNrdG9wL2RhdGFfZ2Vub21pY3NfU1JSL2Fubm90YXRlZF9TUlIyNjk4MDU1MC52Y2YiLCBza2lwPTEyOSAsc3RyaW5nc0FzRmFjdG9ycyA9IEZBTFNFKQ0KdmNmX2RhdGFfNTUxIDwtIHJlYWQuZGVsaW0oIi9Vc2Vycy9HZWJydWlrZXIvRGVza3RvcC9kYXRhX2dlbm9taWNzX1NSUi9hbm5vdGF0ZWRfU1JSMjY5ODA1NTEudmNmIiwgc2tpcD0xMjkgLHN0cmluZ3NBc0ZhY3RvcnMgPSBGQUxTRSkNCnZjZl9kYXRhXzU1MiA8LSByZWFkLmRlbGltKCIvVXNlcnMvR2VicnVpa2VyL0Rlc2t0b3AvZGF0YV9nZW5vbWljc19TUlIvYW5ub3RhdGVkX1NSUjI2OTgwNTUyLnZjZiIsIHNraXA9MTI5ICxzdHJpbmdzQXNGYWN0b3JzID0gRkFMU0UpDQoNCmBgYA0KDQpgYGB7ciwgRmlndXV1ciA5On0NCiNoaWVyIGdlYnJ1aWsgaWsgaGVhZCBvbSBkZSBlZXJzdGUgNiBsaWpuZW4gdGUgYmVraWprZW4gZW4gZGUgJFguY2hyb21vc29vbSBvbSB0ZSB6aWVuIG9mIHplIGFsbGVtYWFsIG1ldCBkZXplbGZkZSBjaHJvbW9zb29tIGJlZ2lubmVuDQpoZWFkKHZjZl9kYXRhXzU0OSRYLkNIUk9NKQ0KaGVhZCh2Y2ZfZGF0YV81NTAkWC5DSFJPTSkNCmhlYWQodmNmX2RhdGFfNTUxJFguQ0hST00pDQpoZWFkKHZjZl9kYXRhXzU1MiRYLkNIUk9NKQ0KDQpgYGANCg0KSWsgdm9lciBkZXplIGhlYWQgdWl0IHZvb3IgYWxsZSA0IHNhbXBsZXMgb21kYXQgaWsgd2lsIHppZW4gb2YgemUgYWxsZW1hYWwgZGV6ZWxmZGUgY2hyIGJldmF0dGVuIHdhYXJkb29yIGlrIHdlZXQgb2YgaWsgZGllIGthbiBnZWJydWlrZW4gdm9vciBkZSBmaWx0ZXIgc3RhcCBpbiBkZSB2b2xnZW5kZSBjb2RlLg0KDQpgYGB7ciwgRmlndXV1ciAxMDp9DQoNCiNIaWVyIGdlYnJ1aWsgaWsgZ3JlcGwgbmlldCBncmVwIG9tZGF0IGdyZXBsIGtpamt0IGluIGRlIGtvbGxvbWVuIG9mIE5DXzAwMDA2Ny43IHZvb3Jrb210IGVuIGRhbiBzcGVjaWZpZWsgZGUgdmNmX2RhdGFfNTQ5JFguQ0hST00ga29sb20gYWxzIGRlemUgdHJ1ZSBpcyB3b3JkIGRlIGhlbGUgcm93IGRpZSBkZXplIGJldmF0IG1lZWdlZ2V2ZW4gYWFuIGRlIG5pZXV3ZSB2YXJpYWJsZS4NCnZjZl9kYXRhXzU0OV9maWx0ZXJkIDwtIHZjZl9kYXRhXzU0OVtncmVwbCgiTkNfMDAwMDc3LjciLCB2Y2ZfZGF0YV81NDkkWC5DSFJPTSksXSANCnZhcmlhYmxlX3BvaXNpdGlvbnNfNTQ5IDwtIHZjZl9kYXRhXzU0OV9maWx0ZXJkJFBPUw0KDQojaGllciB3b3JkdCBlZW4gcGxvdCBnZW1hYWt0IHdhYXIgaWsgdmFuIHZhcmlhYmxlX3BvaXNpdGlvbnNfNTQ5IGVlbiBkYXRhZnJhbWUgbWFhayB6b2RhdCBoZXQgd2Vya3QgbWV0IGdncGxvdCBkYW4gemV0IGlrIGRlIHggb29rIG5hYXIgaGV0IGRhdGEgZnJhbWUgZW4gaWsgd2lsIGRhdCBoZXQgZWVuIGdlb21faGlzdG9ncmFtIGlzIHdlZXIgbWV0IGRlIGJpbndpZHRoIGRlemUgaXMgMTAwMDAwMCBEaXQgYmV0ZWtlbnQgZGF0IGVsayBiaW4gKGJhbGtqZSkgZWVuIGJyZWVkdGUgaGVlZnQgdmFuIDEgbWlsam9lbiAoMSwwMDAsMDAwKSBwb3NpdGllcy4gZGFhcm5hIHpldCBpayBkZSB4IGVuIHkgbGFiZWxzIG1ldCBsYWJzIGVuIGhldCB0aGVtYSB2YW4gZGUgZ3JhZmllaw0KcF81NDkgPC0gZ2dwbG90KGRhdGEuZnJhbWUodmFyaWFibGVfcG9pc2l0aW9uc181NDkpLCBhZXMoeCA9IHZhcmlhYmxlX3BvaXNpdGlvbnNfNTQ5KSkgKw0KICBnZW9tX2hpc3RvZ3JhbShiaW53aWR0aCA9IDEwMDAwMDAsIGZpbGwgPSAiYmx1ZSIsIGNvbG9yID0gImJsdWUiKSArDQogIGxhYnMoeCA9ICJQb3NpdGllIChjb8O2cmRpbmF0ZW4pIG9wIE5DXzAwMDA3Ny43IiwNCiAgICAgICB5ID0gIkFhbnRhbCB2YXJpYW50ZW4iKSAgKw0KICAgIHRoZW1lX21pbmltYWwoKQ0KDQojSGllciBnZWJydWlrIGlrIGdyZXBsIG5pZXQgZ3JlcCBvbWRhdCBncmVwbCBraWprdCBpbiBkZSBrb2xsb21lbiBvZiBOQ18wMDAwNjcuNyB2b29ya29tdCBlbiBkYW4gc3BlY2lmaWVrIGRlIHZjZl9kYXRhXzU1MCRYLkNIUk9NIGtvbG9tIGFscyBkZXplIHRydWUgaXMgd29yZCBkZSBoZWxlIHJvdyBkaWUgZGV6ZSBiZXZhdCBtZWVnZWdldmVuIGFhbiBkZSBuaWV1d2UgdmFyaWFibGUuDQp2Y2ZfZGF0YV81NTBfZmlsdGVyZCA8LSB2Y2ZfZGF0YV81NTBbZ3JlcGwoIk5DXzAwMDA3Ny43IiwgdmNmX2RhdGFfNTUwJFguQ0hST00pLF0gDQp2YXJpYWJsZV9wb2lzaXRpb25zXzU1MCA8LSB2Y2ZfZGF0YV81NTBfZmlsdGVyZCRQT1MNCg0KI2hpZXIgd29yZHQgZWVuIHBsb3QgZ2VtYWFrdCB3YWFyIGlrIHZhbiB2YXJpYWJsZV9wb2lzaXRpb25zXzU1MCBlZW4gZGF0YWZyYW1lIG1hYWsgem9kYXQgaGV0IHdlcmt0IG1ldCBnZ3Bsb3QgZGFuIHpldCBpayBkZSB4IG9vayBuYWFyIGhldCBkYXRhIGZyYW1lIGVuIGlrIHdpbCBkYXQgaGV0IGVlbiBnZW9tX2hpc3RvZ3JhbSBpcyB3ZWVyIG1ldCBkZSBiaW53aWR0aCBkZXplIGlzIDEwMDAwMDAgRGl0IGJldGVrZW50IGRhdCBlbGsgYmluIChiYWxramUpIGVlbiBicmVlZHRlIGhlZWZ0IHZhbiAxIG1pbGpvZW4gKDEsMDAwLDAwMCkgcG9zaXRpZXMuIGRhYXJuYSB6ZXQgaWsgZGUgeCBlbiB5IGxhYmVscyBtZXQgbGFicyBlbiBoZXQgdGhlbWEgdmFuIGRlIGdyYWZpZWsNCnBfNTUwIDwtIGdncGxvdChkYXRhLmZyYW1lKHZhcmlhYmxlX3BvaXNpdGlvbnNfNTUwKSwgYWVzKHggPSB2YXJpYWJsZV9wb2lzaXRpb25zXzU1MCkpICsNCiAgZ2VvbV9oaXN0b2dyYW0oYmlud2lkdGggPSAxMDAwMDAwLCBmaWxsID0gImJsdWUiLCBjb2xvciA9ICJibHVlIikgKw0KICBsYWJzKHggPSAiUG9zaXRpZSAoY2/DtnJkaW5hdGVuKSBvcCBOQ18wMDAwNzcuNyIsDQogICAgICAgeSA9ICJBYW50YWwgdmFyaWFudGVuIikgICsNCiAgICB0aGVtZV9taW5pbWFsKCkNCg0KI0hpZXIgZ2VicnVpayBpayBncmVwbCBuaWV0IGdyZXAgb21kYXQgZ3JlcGwga2lqa3QgaW4gZGUga29sbG9tZW4gb2YgTkNfMDAwMDY3Ljcgdm9vcmtvbXQgZW4gZGFuIHNwZWNpZmllayBkZSB2Y2ZfZGF0YV81NTEkWC5DSFJPTSBrb2xvbSBhbHMgZGV6ZSB0cnVlIGlzIHdvcmQgZGUgaGVsZSByb3cgZGllIGRlemUgYmV2YXQgbWVlZ2VnZXZlbiBhYW4gZGUgbmlldXdlIHZhcmlhYmxlLg0KdmNmX2RhdGFfNTUxX2ZpbHRlcmQgPC0gdmNmX2RhdGFfNTUxW2dyZXBsKCJOQ18wMDAwNzcuNyIsIHZjZl9kYXRhXzU1MSRYLkNIUk9NKSxdIA0KdmFyaWFibGVfcG9pc2l0aW9uc181NTEgPC0gdmNmX2RhdGFfNTUxX2ZpbHRlcmQkUE9TDQoNCiNoaWVyIHdvcmR0IGVlbiBwbG90IGdlbWFha3Qgd2FhciBpayB2YW4gdmFyaWFibGVfcG9pc2l0aW9uc181NTEgZWVuIGRhdGFmcmFtZSBtYWFrIHpvZGF0IGhldCB3ZXJrdCBtZXQgZ2dwbG90IGRhbiB6ZXQgaWsgZGUgeCBvb2sgbmFhciBoZXQgZGF0YSBmcmFtZSBlbiBpayB3aWwgZGF0IGhldCBlZW4gZ2VvbV9oaXN0b2dyYW0gaXMgd2VlciBtZXQgZGUgYmlud2lkdGggZGV6ZSBpcyAxMDAwMDAwIERpdCBiZXRla2VudCBkYXQgZWxrIGJpbiAoYmFsa2plKSBlZW4gYnJlZWR0ZSBoZWVmdCB2YW4gMSBtaWxqb2VuICgxLDAwMCwwMDApIHBvc2l0aWVzLiBkYWFybmEgemV0IGlrIGRlIHggZW4geSBsYWJlbHMgbWV0IGxhYnMgZW4gaGV0IHRoZW1hIHZhbiBkZSBncmFmaWVrDQpwXzU1MSA8LSBnZ3Bsb3QoZGF0YS5mcmFtZSh2YXJpYWJsZV9wb2lzaXRpb25zXzU1MSksIGFlcyh4ID0gdmFyaWFibGVfcG9pc2l0aW9uc181NTEpKSArDQogIGdlb21faGlzdG9ncmFtKGJpbndpZHRoID0gMTAwMDAwMCwgZmlsbCA9ICJibHVlIiwgY29sb3IgPSAiYmx1ZSIpICsNCiAgbGFicyh4ID0gIlBvc2l0aWUgKGNvw7ZyZGluYXRlbikgb3AgTkNfMDAwMDc3LjciLA0KICAgICAgIHkgPSAiQWFudGFsIHZhcmlhbnRlbiIpICArDQogICAgdGhlbWVfbWluaW1hbCgpDQoNCiNIaWVyIGdlYnJ1aWsgaWsgZ3JlcGwgbmlldCBncmVwIG9tZGF0IGdyZXBsIGtpamt0IGluIGRlIGtvbGxvbWVuIG9mIE5DXzAwMDA2Ny43IHZvb3Jrb210IGVuIGRhbiBzcGVjaWZpZWsgZGUgdmNmX2RhdGFfNTUyJFguQ0hST00ga29sb20gYWxzIGRlemUgdHJ1ZSBpcyB3b3JkIGRlIGhlbGUgcm93IGRpZSBkZXplIGJldmF0IG1lZWdlZ2V2ZW4gYWFuIGRlIG5pZXV3ZSB2YXJpYWJsZS4NCnZjZl9kYXRhXzU1Ml9maWx0ZXJkIDwtIHZjZl9kYXRhXzU1MltncmVwbCgiTkNfMDAwMDc3LjciLCB2Y2ZfZGF0YV81NTIkWC5DSFJPTSksXSANCnZhcmlhYmxlX3BvaXNpdGlvbnNfNTUyIDwtIHZjZl9kYXRhXzU1Ml9maWx0ZXJkJFBPUw0KDQojaGllciB3b3JkdCBlZW4gcGxvdCBnZW1hYWt0IHdhYXIgaWsgdmFuIHZhcmlhYmxlX3BvaXNpdGlvbnNfNTUyIGVlbiBkYXRhZnJhbWUgbWFhayB6b2RhdCBoZXQgd2Vya3QgbWV0IGdncGxvdCBkYW4gemV0IGlrIGRlIHggb29rIG5hYXIgaGV0IGRhdGEgZnJhbWUgZW4gaWsgd2lsIGRhdCBoZXQgZWVuIGdlb21faGlzdG9ncmFtIGlzIHdlZXIgbWV0IGRlIGJpbndpZHRoIGRlemUgaXMgMTAwMDAwMCBEaXQgYmV0ZWtlbnQgZGF0IGVsayBiaW4gKGJhbGtqZSkgZWVuIGJyZWVkdGUgaGVlZnQgdmFuIDEgbWlsam9lbiAoMSwwMDAsMDAwKSBwb3NpdGllcy4gZGFhcm5hIHpldCBpayBkZSB4IGVuIHkgbGFiZWxzIG1ldCBsYWJzIGVuIGhldCB0aGVtYSB2YW4gZGUgZ3JhZmllaw0KcF81NTIgPC0gZ2dwbG90KGRhdGEuZnJhbWUodmFyaWFibGVfcG9pc2l0aW9uc181NTIpLCBhZXMoeCA9IHZhcmlhYmxlX3BvaXNpdGlvbnNfNTUyKSkgKw0KICBnZW9tX2hpc3RvZ3JhbShiaW53aWR0aCA9IDEwMDAwMDAsIGZpbGwgPSAiYmx1ZSIsIGNvbG9yID0gImJsdWUiKSArDQogIGxhYnMoeCA9ICJQb3NpdGllIChjb8O2cmRpbmF0ZW4pIG9wIE5DXzAwMDA3Ny43ICIsDQogICAgICAgeSA9ICJBYW50YWwgdmFyaWFudGVuIikgKw0KICAgIHRoZW1lX21pbmltYWwoKQ0KcF81NTINCmBgYA0KDQpIaWVyIGlzIGRlIHBsb3QgdmFuIHNhbXBsZSA1NTIgdGUgemllbiwgZXIgaXMgdGUgemllbiBkYXQgYWFuIGhldCBiZWdpbiBlciBlZW4gZ3JvdGUgcGllayBpcyB3YXQgYmV0ZWtlbnQgZGF0IGVyIG5ldCBtaW5kZXIgZGFuIDQwMCB2YXJpYW50ZW4gb3AgZGV6ZSBsb2NhdGllIHppY2ggYmV2aW5kZW4uIFVpdCBkZXplIHBsb3QgaXMgbmlldCB0ZSBoYWxlbiB3YXQgdm9vciB0eXBlIHZhcmlhbnRlbiBoZXQgemlqbiBvZiB3YXQgdm9vciBzY2hhZGUgLyBnZWVuIHNjaGFkZSB6ZSBhYW5icmVuZ2VuLiBEZXplIHBsb3QgemVndCB3ZWwgZGF0IGhldCBiZWdpbiB2YW4gZGUgRWJmMSBwcm90ZWluZSBzZXF1ZW50aWUgaW4gZGUgNTUyIHNhbXBsZSB2ZWVsIHZhcmlhbnRlbiB6aXR0ZW4gZHVzIGludGVyZXNzYW50IGthbiB6aWpuIHZvb3IgZGllcGVyZSBhbmFseXNlIC4gTkNfMDAwMDc3LjcgaXMgZGUgbG9jYXRpZSB2YW4gZGUgRWJmMSBwcm90ZWluZSBkZXplIGdhYXQgdmFuIDQ0NTAyNzM4IC0gNDQ4OTg5MjMgYWxkdXMgPGh0dHBzOi8vd3d3Lm5jYmkubmxtLm5paC5nb3YvZ2VuZS8xMzU5MT4uDQoNCmdncGxvdDIgaXMgZWVuIGxpYnJhcnkgaW4gUiBkaWUgZ2VicnVpa3Qga2FuIHdvcmRlbiBvbSB1aXRnZWJyZWlkZXJlIHBsb3RzIHRlIG1ha2VuIGRhbiBkYXQgYmFzZSBSIGRhdCBrYW4uIERpdCBob3VkIGluIGRhdCBhbGxlcyBhYW4gdGUgcGFzc2VuIGlzLCB2YW4ga2xldXJlbiB0b3QgbGFiZWxzIHRvdCB0aXRlbHMgZW4gbm9nIHZlZWwgbWVlciBhbmRlcmUgc3RpamwgYWFucGFzc2luZ2VuLg0KDQpgYGB7ciwgRmlndXV1ciAxMTogRGlzdHJpYnV0aWUgdmFuIFZhcmlhbnQgcG9zaXRpZXMgRWJmMSBvdmVyIHZpZXIgdmVyc2NoaWxsZW5kZSBzYW1wbGVzfQ0KDQojaGllciB3b3JkdCBnZ2FycmFuZ2UgZ2VicnVpa3Qgb20gZGUgdmVyc2NoaWxsZW5kZSBwbG90cyBzYW1lbiBpbiAxIGZyYW1lIHRlIHpldHRlbiB3YWFyZG9vciBoZXQgbWFra2VsaWprZXIgdGUgdmVyZ2VsaWprZW4gaXMgaW4gMSBvcHppY2h0LiBsYWJlbHMgZW4gZGUgcm93cyB6b3JnZW4gdm9vciB2ZXJkdWlkZWxpamtpbmcgdmFuIHdhdCBkZSBzYW1wbGVzIHppam4gZW4gaG9lIGRlIHBsb3RzIGdlb3JkZW5kIHppam4NCm11bHRpX3Bvc19wbG90IDwtIGdnYXJyYW5nZShwXzU0OSwgcF81NTAsIHBfNTUxLCBwXzU1MiwNCiAgICAgICAgICBsYWJlbHMgPSBjKCJTYW1wbGU6IDU0OSIsICJTYW1wbGU6IDU1MCIsICJTYW1wbGU6IDU1MSIsICJTYW1wbGU6IDU1MiIpLA0KICAgICAgICAgIG5jb2wgPSAyLCBucm93ID0gMikNCg0KI2hpZXIgd29yZHQgZGUgcGxvdCB0aXRlbCB3ZWVyZ2VnZXZlbiAxIGFsZ2VtZW5lIHRpdGVsIGlucGxhYXRzIHZhbiA0IGRlemVsZmRlDQphbm5vdGF0ZV9maWd1cmUobXVsdGlfcG9zX3Bsb3QsIHRvcCA9IHRleHRfZ3JvYigiRGlzdHJpYnV0aWUgdmFuIFZhcmlhbnQgcG9zaXRpZXMgRWJmMSAiLCANCiAgICAgICAgICAgICAgIGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDE0KSkNCmBgYA0KDQpIaWVyIHppam4gNCBwbG90cyB0ZSB6aWVuIHdhYXIgZGUgcG9zaXRpZSB2YW4gdmFyaWFudGVuIHppam4gdGUgemllbiBpbiBoZXQgRWJmMSBnZW4gKE5DXzAwMDA3MC43KS5cDQpFciBpcyB0ZSB6aWVuIGRhdCBlciBncm90ZSBpbnRlcmVzc2FudGUgcGlla2VuIHppam4gd2FhciBkaWVwZXIgaW4gbW9ldCB3b3JkZW4gZ2VrZWtlbiB3YXQgdm9vciB2YXJpYW50ZW4gaGV0IHppam4gZW4gb2YgaGV0IG9wIGVlbiBleG9uIHppdCBvZiBuaWV0Lg0KDQpgYGB7cn0NCmhlYWQodmNmX2RhdGFfNTQ5KQ0KYGBgDQoNCmBgYHtyLCBGaWd1dXVyIDEyOiBEaXN0cmlidXRpZSB2YW4gVmFyaWFudCBwb3NpdGllcyBwYXg1fQ0KDQojSGllciBnZWJydWlrIGlrIGdyZXBsIG5pZXQgZ3JlcCBvbWRhdCBncmVwbCBraWprdCBpbiBkZSBrb2xsb21lbiBvZiBOQ18wMDAwNjcuNyB2b29ya29tdCBlbiBkYW4gc3BlY2lmaWVrIGRlIHZjZl9kYXRhXzU0OSRYLkNIUk9NIGtvbG9tIGFscyBkZXplIHRydWUgaXMgd29yZCBkZSBoZWxlIHJvdyBkaWUgZGV6ZSBiZXZhdCBtZWVnZWdldmVuIGFhbiBkZSBuaWV1d2UgdmFyaWFibGUuDQp2Y2ZfZGF0YV81NDlfcGF4NSA8LSB2Y2ZfZGF0YV81NDlbZ3JlcGwoIk5DXzAwMDA3MC43IiwgdmNmX2RhdGFfNTQ5JFguQ0hST00pLF0gDQp2YXJpYWJsZV9wb2lzaXRpb25zXzU0OSA8LSB2Y2ZfZGF0YV81NDlfcGF4NSRQT1MNCg0KI2hpZXIgd29yZHQgZWVuIHBsb3QgZ2VtYWFrdCB3YWFyIGlrIHZhbiB2YXJpYWJsZV9wb2lzaXRpb25zXzU0OSBlZW4gZGF0YWZyYW1lIG1hYWsgem9kYXQgaGV0IHdlcmt0IG1ldCBnZ3Bsb3QgZGFuIHpldCBpayBkZSB4IG9vayBuYWFyIGhldCBkYXRhIGZyYW1lIGVuIGlrIHdpbCBkYXQgaGV0IGVlbiBnZW9tX2hpc3RvZ3JhbSBpcyB3ZWVyIG1ldCBkZSBiaW53aWR0aCBkZXplIGlzIDEwMDAwMDAgRGl0IGJldGVrZW50IGRhdCBlbGsgYmluIChiYWxramUpIGVlbiBicmVlZHRlIGhlZWZ0IHZhbiAxIG1pbGpvZW4gKDEsMDAwLDAwMCkgcG9zaXRpZXMuIGRhYXJuYSB6ZXQgaWsgZGUgeCBlbiB5IGxhYmVscyBtZXQgbGFicyBlbiBoZXQgdGhlbWEgdmFuIGRlIGdyYWZpZWsNCnBfNTQ5IDwtIGdncGxvdChkYXRhLmZyYW1lKHZhcmlhYmxlX3BvaXNpdGlvbnNfNTQ5KSwgYWVzKHggPSB2YXJpYWJsZV9wb2lzaXRpb25zXzU0OSkpICsNCiAgZ2VvbV9oaXN0b2dyYW0oYmlud2lkdGggPSAxMDAwMDAwLCBmaWxsID0gImJsYWNrIiwgY29sb3IgPSAiYmxhY2siKSArDQogIGxhYnMoeCA9ICJQb3NpdGllIChjb8O2cmRpbmF0ZW4pIG9wIE5DXzAwMDA3MC43IiwNCiAgICAgICB5ID0gIkFhbnRhbCB2YXJpYW50ZW4iKSAgKw0KICAgIHRoZW1lX21pbmltYWwoKQ0KDQojSGllciBnZWJydWlrIGlrIGdyZXBsIG5pZXQgZ3JlcCBvbWRhdCBncmVwbCBraWprdCBpbiBkZSBrb2xsb21lbiBvZiBOQ18wMDAwNjcuNyB2b29ya29tdCBlbiBkYW4gc3BlY2lmaWVrIGRlIHZjZl9kYXRhXzU1MCRYLkNIUk9NIGtvbG9tIGFscyBkZXplIHRydWUgaXMgd29yZCBkZSBoZWxlIHJvdyBkaWUgZGV6ZSBiZXZhdCBtZWVnZWdldmVuIGFhbiBkZSBuaWV1d2UgdmFyaWFibGUuDQp2Y2ZfZGF0YV81NTBfcGF4NSA8LSB2Y2ZfZGF0YV81NTBbZ3JlcGwoIk5DXzAwMDA3MC43IiwgdmNmX2RhdGFfNTUwJFguQ0hST00pLF0gDQp2YXJpYWJsZV9wb2lzaXRpb25zXzU1MCA8LSB2Y2ZfZGF0YV81NTBfcGF4NSRQT1MNCg0KI2hpZXIgd29yZHQgZWVuIHBsb3QgZ2VtYWFrdCB3YWFyIGlrIHZhbiB2YXJpYWJsZV9wb2lzaXRpb25zXzU1MCBlZW4gZGF0YWZyYW1lIG1hYWsgem9kYXQgaGV0IHdlcmt0IG1ldCBnZ3Bsb3QgZGFuIHpldCBpayBkZSB4IG9vayBuYWFyIGhldCBkYXRhIGZyYW1lIGVuIGlrIHdpbCBkYXQgaGV0IGVlbiBnZW9tX2hpc3RvZ3JhbSBpcyB3ZWVyIG1ldCBkZSBiaW53aWR0aCBkZXplIGlzIDEwMDAwMDAgRGl0IGJldGVrZW50IGRhdCBlbGsgYmluIChiYWxramUpIGVlbiBicmVlZHRlIGhlZWZ0IHZhbiAxIG1pbGpvZW4gKDEsMDAwLDAwMCkgcG9zaXRpZXMuIGRhYXJuYSB6ZXQgaWsgZGUgeCBlbiB5IGxhYmVscyBtZXQgbGFicyBlbiBoZXQgdGhlbWEgdmFuIGRlIGdyYWZpZWsNCnBfNTUwIDwtIGdncGxvdChkYXRhLmZyYW1lKHZhcmlhYmxlX3BvaXNpdGlvbnNfNTUwKSwgYWVzKHggPSB2YXJpYWJsZV9wb2lzaXRpb25zXzU1MCkpICsNCiAgZ2VvbV9oaXN0b2dyYW0oYmlud2lkdGggPSAxMDAwMDAwLCBmaWxsID0gImJsYWNrIiwgY29sb3IgPSAiYmxhY2siKSArDQogIGxhYnMoeCA9ICJQb3NpdGllIChjb8O2cmRpbmF0ZW4pIG9wIE5DXzAwMDA3MC43IiwNCiAgICAgICB5ID0gIkFhbnRhbCB2YXJpYW50ZW4iKSAgKw0KICAgIHRoZW1lX21pbmltYWwoKQ0KDQojSGllciBnZWJydWlrIGlrIGdyZXBsIG5pZXQgZ3JlcCBvbWRhdCBncmVwbCBraWprdCBpbiBkZSBrb2xsb21lbiBvZiBOQ18wMDAwNjcuNyB2b29ya29tdCBlbiBkYW4gc3BlY2lmaWVrIGRlIHZjZl9kYXRhXzU1MSRYLkNIUk9NIGtvbG9tIGFscyBkZXplIHRydWUgaXMgd29yZCBkZSBoZWxlIHJvdyBkaWUgZGV6ZSBiZXZhdCBtZWVnZWdldmVuIGFhbiBkZSBuaWV1d2UgdmFyaWFibGUuDQp2Y2ZfZGF0YV81NTFfcGF4NSA8LSB2Y2ZfZGF0YV81NTFbZ3JlcGwoIk5DXzAwMDA3Ny43IiwgdmNmX2RhdGFfNTUxJFguQ0hST00pLF0gDQp2YXJpYWJsZV9wb2lzaXRpb25zXzU1MSA8LSB2Y2ZfZGF0YV81NTFfcGF4NSRQT1MNCg0KI2hpZXIgd29yZHQgZWVuIHBsb3QgZ2VtYWFrdCB3YWFyIGlrIHZhbiB2YXJpYWJsZV9wb2lzaXRpb25zXzU1MSBlZW4gZGF0YWZyYW1lIG1hYWsgem9kYXQgaGV0IHdlcmt0IG1ldCBnZ3Bsb3QgZGFuIHpldCBpayBkZSB4IG9vayBuYWFyIGhldCBkYXRhIGZyYW1lIGVuIGlrIHdpbCBkYXQgaGV0IGVlbiBnZW9tX2hpc3RvZ3JhbSBpcyB3ZWVyIG1ldCBkZSBiaW53aWR0aCBkZXplIGlzIDEwMDAwMDAgRGl0IGJldGVrZW50IGRhdCBlbGsgYmluIChiYWxramUpIGVlbiBicmVlZHRlIGhlZWZ0IHZhbiAxIG1pbGpvZW4gKDEsMDAwLDAwMCkgcG9zaXRpZXMuIGRhYXJuYSB6ZXQgaWsgZGUgeCBlbiB5IGxhYmVscyBtZXQgbGFicyBlbiBoZXQgdGhlbWEgdmFuIGRlIGdyYWZpZWsNCnBfNTUxIDwtIGdncGxvdChkYXRhLmZyYW1lKHZhcmlhYmxlX3BvaXNpdGlvbnNfNTUxKSwgYWVzKHggPSB2YXJpYWJsZV9wb2lzaXRpb25zXzU1MSkpICsNCiAgZ2VvbV9oaXN0b2dyYW0oYmlud2lkdGggPSAxMDAwMDAwLCBmaWxsID0gImJsYWNrIiwgY29sb3IgPSAiYmxhY2siKSArDQogIGxhYnMoeCA9ICJQb3NpdGllIChjb8O2cmRpbmF0ZW4pIG9wIE5DXzAwMDA3MC43IiwNCiAgICAgICB5ID0gIkFhbnRhbCB2YXJpYW50ZW4iKSAgKw0KICAgIHRoZW1lX21pbmltYWwoKQ0KDQojSGllciBnZWJydWlrIGlrIGdyZXBsIG5pZXQgZ3JlcCBvbWRhdCBncmVwbCBraWprdCBpbiBkZSBrb2xsb21lbiBvZiBOQ18wMDAwNjcuNyB2b29ya29tdCBlbiBkYW4gc3BlY2lmaWVrIGRlIHZjZl9kYXRhXzU1MiRYLkNIUk9NIGtvbG9tIGFscyBkZXplIHRydWUgaXMgd29yZCBkZSBoZWxlIHJvdyBkaWUgZGV6ZSBiZXZhdCBtZWVnZWdldmVuIGFhbiBkZSBuaWV1d2UgdmFyaWFibGUuDQp2Y2ZfZGF0YV81NTJfcGF4NSA8LSB2Y2ZfZGF0YV81NTJbZ3JlcGwoIk5DXzAwMDA3MC43IiwgdmNmX2RhdGFfNTUyJFguQ0hST00pLF0gDQp2YXJpYWJsZV9wb2lzaXRpb25zXzU1MiA8LSB2Y2ZfZGF0YV81NTJfcGF4NSRQT1MNCg0KI2hpZXIgd29yZHQgZWVuIHBsb3QgZ2VtYWFrdCB3YWFyIGlrIHZhbiB2YXJpYWJsZV9wb2lzaXRpb25zXzU1MiBlZW4gZGF0YWZyYW1lIG1hYWsgem9kYXQgaGV0IHdlcmt0IG1ldCBnZ3Bsb3QgZGFuIHpldCBpayBkZSB4IG9vayBuYWFyIGhldCBkYXRhIGZyYW1lIGVuIGlrIHdpbCBkYXQgaGV0IGVlbiBnZW9tX2hpc3RvZ3JhbSBpcyB3ZWVyIG1ldCBkZSBiaW53aWR0aCBkZXplIGlzIDEwMDAwMDAgRGl0IGJldGVrZW50IGRhdCBlbGsgYmluIChiYWxramUpIGVlbiBicmVlZHRlIGhlZWZ0IHZhbiAxIG1pbGpvZW4gKDEsMDAwLDAwMCkgcG9zaXRpZXMuIGRhYXJuYSB6ZXQgaWsgZGUgeCBlbiB5IGxhYmVscyBtZXQgbGFicyBlbiBoZXQgdGhlbWEgdmFuIGRlIGdyYWZpZWsNCnBfNTUyIDwtIGdncGxvdChkYXRhLmZyYW1lKHZhcmlhYmxlX3BvaXNpdGlvbnNfNTUyKSwgYWVzKHggPSB2YXJpYWJsZV9wb2lzaXRpb25zXzU1MikpICsNCiAgZ2VvbV9oaXN0b2dyYW0oYmlud2lkdGggPSAxMDAwMDAwLCBmaWxsID0gImJsYWNrIiwgY29sb3IgPSAiYmxhY2siKSArDQogIGxhYnMoeCA9ICJQb3NpdGllIChjb8O2cmRpbmF0ZW4pIG9wIE5DXzAwMDA3MC43IiwNCiAgICAgICB5ID0gIkFhbnRhbCB2YXJpYW50ZW4iKSArDQogICAgdGhlbWVfbWluaW1hbCgpDQpwXzU1Mg0KYGBgDQoNCkluIGZpZ3V1ciAxMiBpcyBlZW4gaGlzdG9ncmFtIHRlIHppZW4gd2FhciBkZSBkaXN0cnVidXRpZSB2YW4gdmFyaWFudGVuIG92ZXIgY2hyb21vc29vbSAiTkNfMDAwMDcwLjciIHdvcmR0IHdlZXJnZWdldmVuLiBEaXQgc2FtcGxlIGhlZWZ0IG9wbWVya2VsaWprIDMgcGlla2VuIGFhbiBoZXQgYmVnaW4gZW4gMiBhYW4gaGV0IGVpbmRlLiBkaXQga2FuIHdpanplbiBvcCBlZW4gaG90c3BvdCB2b29yIG11dGF0aWVzLiBOdSBraWprZW4gb2YgaGV0IGJpaiBkZSBhbmRlcmUgc2FtcGxlcyBoZXR6ZWxmZGUgaXMuDQoNCmBgYHtyLCBGaWd1dXIgMTM6IGRpc3RyaWJ1dGllIHZhbiB2YXJpYW50cG9zaXRpZXMgb3AgcGF4NSBvdmVyIHZpZXIgdmVyc2NoaWxsZW5kZSBzYW1wbGVzfQ0KDQojaGllciB3b3JkdCBnZ2FycmFuZ2UgZ2VicnVpa3Qgb20gZGUgdmVyc2NoaWxsZW5kZSBwbG90cyBzYW1lbiBpbiAxIGZyYW1lIHRlIHpldHRlbiB3YWFyZG9vciBoZXQgbWFra2VsaWprZXIgdGUgdmVyZ2VsaWprZW4gaXMgaW4gMSBvcHppY2h0LiBsYWJlbHMgZW4gZGUgcm93cyB6b3JnZW4gdm9vciB2ZXJkdWlkZWxpamtpbmcgdmFuIHdhdCBkZSBzYW1wbGVzIHppam4gZW4gaG9lIGRlIHBsb3RzIGdlb3JkZW5kIHppam4NCm11bHRpX3Bvc19wbG90IDwtIGdnYXJyYW5nZShwXzU0OSwgcF81NTAsIHBfNTUxLCBwXzU1MiwNCiAgICAgICAgICBsYWJlbHMgPSBjKCJTYW1wbGU6IDU0OSIsICJTYW1wbGU6IDU1MCIsICJTYW1wbGU6IDU1MSIsICJTYW1wbGU6IDU1MiIpLA0KICAgICAgICAgIG5jb2wgPSAyLCBucm93ID0gMikNCg0KI2hpZXIgd29yZHQgZGUgcGxvdCB0aXRlbCB3ZWVyZ2VnZXZlbiAxIGFsZ2VtZW5lIHRpdGVsIGlucGxhYXRzIHZhbiA0IGRlemVsZmRlDQphbm5vdGF0ZV9maWd1cmUobXVsdGlfcG9zX3Bsb3QsIHRvcCA9IHRleHRfZ3JvYigiRGlzdHJpYnV0aWUgdmFuIFZhcmlhbnQgcG9zaXRpZXMgcGF4NSIsIA0KICAgICAgICAgICAgICAgY29sb3IgPSAiYmxhY2siLCBzaXplID0gMTQpKQ0KYGBgDQoNCkluIGZpZ3V1ciAxMyB6aWpuIGRlIDQgcGxvdHMgdmFuIHZhcmlhbnRlbiBvcCBkZSBOQ18wMDAwNzAuNyBvb2sgd2VsIGRlIFBheDUuIEVyIGlzIHRlIHppZW4gZGF0IGVyIDMgcGlla2VuIHppam4uIEFhbiBoZXQgYmVnaW4gZW4gMiBhYW4gaGV0IGVpbmRlIHZhbiBkZSBzYW1wbGVzLiBXYXQgd2VsIG9wbWVya2VsaWprIGlzIGRhdCBpbiBzYW1wbGUgNTUyIGJpaiB2ZXJyZSBkZSBob29nc3RlIHBlYWsgaGVlZnQgZGV6ZSB0aWt0IGJpam5hIDEwMDAgdmFyaWFudGVuIGFhbiBvcCAxIHBvc2l0aWUuIFdhdCBoZXQgZHVzIGVlbiBpbnRlcmVzc2FudGUgaG90c3BvdCBtYWFrdCBlbiB6ZWd0IGRhdCBlciByb25kIGRlemUgcG9zaXRpZSBlZW4gZGllcGVyZSBhbmFseXNlIG1vZXQgZ2ViZXVyZW4uDQoNCiMjIFdlZWsgNSAtICoqQ2hyb21vc29vbSBuYW1lbiB3aWp6aWdlbioqDQoNCkRlIGNocm9tb3Nvb21uYW1lbiB3YXJlbiBpbiBkZSAudmNmIGJlc3RhbmRlbiBtZXQgZGUgR2VuZUJhbmsgbmFtZW4gYWFuZ2VkdWlkIHRlcndpamwgU25wRWZmIFJlZlNlcSBuYW1lbiB2ZXJ3YWNodC4gRGV6ZSBtb2V0ZW4gZHVzIHZlcmFuZGVyZCB3b3JkZW4gem9kYXQgU25wRWZmIGthbiB3ZXJrZW4gdm9vciBkZSBhbmFseXNlIHZhbiB3YXQgZGUgdmFyaWFudGVuIGluaG91ZGVuLg0KDQoqKkhldCBvbXpldHRlbiB2YW4gdmNmIG5hYXIgZWVuIHZjZi5neiBkb29ybWlkZGVsIHZhbiBiZ3ppcCoqDQoNCmBgYHtiYXNoLCBldmFsPUZBTFNFfQ0KI2JnemlwIGlzIGVlbiBjb21wcmVzc2llIHByb2dyYW1tYSB3YXQgdmNmIGVuIGFuZGVyZSBnZW5vaXNjaGUgYmVzdGFuZGVuIGNvcHJpbWVyZW4gaGV0IHpvcmd0IGRhdCBoZXQgY29tcGF0aWJsZSBpcyBtZXQgb25zIHZvbGdlbmRlIHByb2dyYW1tYSB0YWJpeCwgLWMgemVndCBkYXQgZGUgb3V0cHV0IG5hYXIgZGUgc3RhbmRhYXJkIHVpdHZvZXIgbW9ldCBzdHVyZW4saW4gcGxhYXRzIHZhbiBoZXQgYmVzdGFuZCBpbiB0ZSBzY2hyaWp2ZW4uIEhpZXJkb29yIGt1bm5lbiB3ZSBkZSBvdXRwdXQgb21sZWlkZW4gbmFhciBlZW4gbmlldXcgYmVzdGFuZC4NCmJnemlwIC1jIC9zdHVkZW50cy8yMDI0LTIwMjUvVGhlbWEwNS8zZGNvbmZvcm1hdGllQ2hyb21hdGluZS9hbm5vdGF0ZWRfdmFyaWFudHMudmNmID4gL3N0dWRlbnRzLzIwMjQtMjAyNS9UaGVtYTA1LzNkY29uZm9ybWF0aWVDaHJvbWF0aW5lL2Fubm90YXRlZF92YXJpYW50cy52Y2YuZ3oNCg0KYGBgDQoNCkRlIHJlZGVuIG9tIGRlIHZjZiB0ZSBjb21wcmltZXJlbiBpcyBkZSBwaXBlbGluZSBkaWUgd2lqIGdlYnJ1aWtlbiB2b29yIEFub3RhdGllLCB0YWJpeCBoZXQgdm9sZ2VuZGUgcHJvZ3JhbW1hIHZyYWFnIG9tIGVlbiBpbnB1dCB2YW4gZWVuIGdlY29tcHJpbWVlcmQgYmVzdGFuZCBkaXQgaXMgb21kYXQgaGV0IGVmZmljacOrbnRlciBrYW4gem9la2VuIGVuIHZlcndlcmtlbiBpbiBkaXQgZm9ybWF0Lg0KDQoqKkluZGV4ZXJpbmcgbWV0IHRhYml4KioNCg0KYGBge2Jhc2gsIGV2YWw9RkFMU0V9DQojdGFiaXh3b3JkdCBnZWJydWlrdCBvbSBpbmRleGVuIHRlIG1ha2VuIHZvb3IgZ2Vjb21wcmltZWVyZGUgYmVzdGFuZGVuLCB6b2FscyBWQ0YtYmVzdGFuZGVuLmRpdCB6b3JndCBkYXQgaGV0IG1vZ2VsaWprIGlzIG9tIHNuZWwgZ2VnZXZlbnMgdWl0IGhldCBiZXN0YW5kIHRlIGV4dHJhaGVyZW4gb3AgYmFzaXMgdmFuIGNocm9tb3Nvb20gZW4gcG9zaXRpZSwgem9uZGVyIGRhdCBoZXQgaGVsZSBiZXN0YW5kIGdlZGVjb2RlZXJkIGhvZWZ0IHRlIHdvcmRlbi4gLXAgdmNmIGdlZWZ0IGhldCB0eXBlIGJlc3RhbmQgYWFuIGRhdCBqZSBhYW4gaGV0IGluZGV4ZXJlbiBiZW50LiBJbiBkaXQgZ2V2YWwgaXMgaGV0IGVlbiBWQ0YtYmVzdGFuZC4gRGl0IGhlbHB0IHRhYml4IG9tIGRlIGp1aXN0ZSBpbmRlbGluZyBlbiBzdHJ1Y3R1dXIgdm9vciBpbmRleGVyaW5nIHRvZSB0ZSBwYXNzZW4NCnRhYml4IC1wIHZjZiAvc3R1ZGVudHMvMjAyNC0yMDI1L1RoZW1hMDUvM2Rjb25mb3JtYXRpZUNocm9tYXRpbmUvYW5ub3RhdGVkX3ZhcmlhbnRzLnZjZi5neg0KDQpgYGANCg0KVGFiaXggbWFha3QgZWVuIGluZGV4IHZhbiBoZXQgZ2Vjb21wcmltZWVyZGUgVkNGLWJlc3RhbmQuIERlemUgaW5kZXggaXMgZXNzZW50aWVlbCBvbSBzbmVsIHNwZWNpZmlla2UgYmVzdGFuZGVuIGluIGhldCBiZXN0YW5kIG9wIHRlIGt1bm5lbiB6b2VrbiBvcCBiYXNpcyB2YW4gY2hyb21vc29vbSBlbiBwb3NpdGllLiBab25kZXIgZGV6ZSBpbmRleCBpcyBoZXQgbW9laWxpamtlciBvbSBkb29yIGhldCBiZXN0YW5kIHRlIHpvZWtlbiB3YXQgZHVzIGluZWZmaWNpw6tudCB3ZXJrZW4gaXMgb29rIGlzIGhldCBsYXN0aWdlciBlbiBkdXVydCBoZXQgbGFuZ2VyIG9tIGRpbmdlbiBvcCB0ZSBoYWxlbiB1aXQgaGV0IGJlc3RhbmQuDQoNCioqSGVybmFhbSBjaHJvbW9zb21lbioqDQoNCkVlcnN0IG5hbWVzLnR4dCBhYW5tYWtlbg0KDQpgYGB7YmFzaCwgZXZhbD1GQUxTRX0NCiN6Y2F0IG9wZW5kIGRlIHppcHBlZCBmaWxlIC5neiBlbiBsZWVzdCBkZSBvdXRwdXQNCnpjYXQgL3N0dWRlbnRzLzIwMjQtMjAyNS9UaGVtYTA1LzNkY29uZm9ybWF0aWVDaHJvbWF0aW5lL2Fubm90YXRlZF92YXJpYW50cy52Y2YuZ3ogfCBncmVwIC12ICdeIycgfCBjdXQgLWYxIHwgc29ydCB8IHVuaXEgPiBvbGRfY2hyX25hbWVzLnR4dA0KIyBncmVwIC12IGZpbHRlcmQgb3AgbGluZXMgZGllIG1ldCAjIGJlZ2lubmVuLCBjdXQgLWYxIGV4dHJhY3QgZGUgZWVyc3RlIGNvbG9tIHZhbiBkZSBvdmVyZ2VibGV2ZW4gZGF0YSwgc29ydCBzb3J0ZWVkIGRlIGNocm9tb3Nvb20gbmFtZW4sIHVuaXEgdmVyd2lqZGVyZCBkdWJiZWxlbiB6b2RhdCBhbGxlZW4gdW5pZWtlIG92ZXJsYmxpanZlbg0KDQphd2sgJ3twcmludCAkMSwgIngifScgb2xkX2Nocl9uYW1lcy50eHQgPiBuYW1lcy50eHQNCiMgYXdrIHByb2NlZWVyZCBlbGtlIGxpbmUgaW4gb2xkX2Nocl9uYW1lcy50eHQsIHByaW50ICQxIHByaW50IGRlIGNociBuYWFtIGVuIGRlIFggcHJpbnQgZWVuIHgNCg0KY2F0IG5hbWVzLnR4dA0KDQpgYGANCg0KaW4gZGV6ZSBuYW1lcy50ZXh0IGhlYmJlbiB3ZSBoYW5kbWF0aWcgZGUgZ29lZGUgY2hyIHBvc2l0aWUgdWl0Z2V6b2NodCB2b29yIGRlIGJpamJlaG9yZW5kZSBvdWRlbmFtZW4gd2FhcmRvb3IgZGUgdm9sZ2VuZGUgc3RydWN0dXVyIGlzIG9udHN0YWFuDQoNCkNNMDAwOTk0LjMgQ2hyIDFcDQpDTTAwMDk5NS4zIENociAyXA0KQ00wMDA5OTYuMyBDaHIgM1wNCkNNMDAwOTk3LjMgQ2hyIDQNCg0KRGl0IGlzIGdlZGFhbiBkb29ybWlkZGVsIHZhbiA8aHR0cHM6Ly93d3cubmNiaS5ubG0ubmloLmdvdi9kYXRhc2V0cy9nZW5vbWUvR0NGXzAwMDAwMTYzNS4yNy8+DQoNCmBgYHtiYXNoLCBldmFsPUZBTFNFfQ0KIyBiY2Z0b29scyBhbm5vdGF0ZSBpcyBlZW4gc3ViY29tbWFuZG8gdmFuIGJjZnRvb2xzIGRhdCB2Y2YgYmVzdGFuZGVuIG1hbmlwdWxlZXJ0LCBkZSAtLXJlbmFtZS1jaHJzIGJldGVrZW50IGRhdCBpayBkZSBjaHJvbW9zb21lbiB3aWwgaGVybm9tZW4uDQpiY2Z0b29scyBhbm5vdGF0ZSAtLXJlbmFtZS1jaHJzIC9ob21lcy9qamR1aWtlci9EZXNrdG9wL0dlbm9taWNzX3RyYW5zY3JpcHRvbWljc19hbmFseXNpcy9hbmFseXNpcy9KYXJuby9uYW1lcy50eHQgL3N0dWRlbnRzLzIwMjQtMjAyNS9UaGVtYTA1LzNkY29uZm9ybWF0aWVDaHJvbWF0aW5lL2Fubm90YXRlZF92YXJpYW50cy52Y2YuZ3ogPiAvc3R1ZGVudHMvMjAyNC0yMDI1L1RoZW1hMDUvM2Rjb25mb3JtYXRpZUNocm9tYXRpbmUvaGVybm9lbWRfdmFyaWFudF9jYWxsaW5nLnZjZg0KYGBgDQoNCkhpZXIgd29yZHQgaGV0IGJlc3RhbmQgbmFtZXMudHh0IGdlYnJ1aWt0IG9tIGRlIG91ZGUgY2hyb21vc29vbW5hbWVuIGluIGhldCBWQ0YtYmVzdGFuZCB0ZSBoZXJub2VtZW4gbmFhciBkZSBuaWV1d2UgbmFtZW4uIERpdCBpcyBub2RpZyBvbWRhdCBTbnBFZmYgUmVmU2VxIG5hbWVuIHZlcndhY2h0Lg0KDQpgYGB7YmFzaCwgZXZhbD1GQUxTRX0NCiNoaWVyIHdvcmR0IGVlbiBqYXZhIHByb2dyYW1tYSB1aXRnZXZvZXJkIC1YbXg4ZyB6ZWd0IGRhdCBlciBtYXggOGdiIG1hZyB3b3JkZW4gZ2VicnVpa3QsIGRhYXJuYSB3b3JkdCBoZXQgYmVzdGFuZCBhYW5nZXJvZXBlbiAtdiBiZXRla2VudCB2ZXJib3NlIHdhdCB6ZWd0IGRhdCBkZSB1aXR2b2VyIGdlZGV0YWlsbGVlcmQgaXMuLXN0YXRzIHplZ3QgZGF0IGVyIG9wIGhldCB2b2xnZW5kZSBhYW5nZWdldmVuIHBhdGggZWVuIGh0bWwgYmVzdGFuZCBtb2V0IGFhbmdlbWFha3Qgd29yZGVuLiBHUkNoMzgucDE0IGlzIGhldCByZWYgZ2Vub29tLiBkYWFybmEgaGV0IHBhZCBuYWFyIGhldCB2Y2YgZmlsZSB3YXQgZXIgbW9ldCB3b3JkZW4gaGVybm9lbWQgZW4gZGFuIGRlID4gd2Fhcm5hIGhldCBwYWQga29tdCB3YWFyIGhldCBuaWV1d2UgYmVzdGFuZCB3b3JkIG9wZ2VzbGFnZW4NCmphdmEgLVhteDhnIC1qYXIgL3N0dWRlbnRzLzIwMjQtMjAyNS9UaGVtYTA1LzNkY29uZm9ybWF0aWVDaHJvbWF0aW5lL3NucEVmZi9zbnBFZmYvc25wRWZmLmphciAtdiAtc3RhdHMgL3N0dWRlbnRzLzIwMjQtMjAyNS9UaGVtYTA1LzNkY29uZm9ybWF0aWVDaHJvbWF0aW5lL3ZhcmlhbnRfY2FsbGluZy97fV9hbm5vdGF0aWUuaHRtbCBtbTM5IC9zdHVkZW50cy8yMDI0LTIwMjUvVGhlbWEwNS8zZGNvbmZvcm1hdGllQ2hyb21hdGluZS92YXJpYW50X2NhbGxpbmcvaGVybm9lbWRfe30udmNmIC10aHJlYWRzIDUwID4gL3N0dWRlbnRzLzIwMjQtMjAyNS9UaGVtYTA1LzNkY29uZm9ybWF0aWVDaHJvbWF0aW5lL3ZhcmlhbnRfY2FsbGluZy9hbm5vdGF0ZWRfe30udmNmJw0KYGBgDQoNClNucEVmZiBpcyBlZW4gdG9vbCB2b29yIGhldCBhbm5vdGVyZW4gdmFuIHZhcmlhbnRlbi4gU25wRWZmIHZvZWd0IGFuYWx5c2VzIHRvZSB6b2FscyB3ZWxrZSBnZW5lbiB3b3JkZW4gYmXDr252bG9lZCBkb29yIGRlIG11dGF0aWVzIG9mIHdlbGtlIGZ1bmN0aW9uZWxlIGdldm9sZ2VuIGRlIHZhcmlhbnRlbiBoZWJiZW4uIEhpZXIgd29yZHQgb29rIGVlbiBIVE1MLXJhcHBvcnQgZ2VnZW5lcmVlcmQgZGF0IHN0YXRpc3RpZWtlbiBnZWVmdCBvdmVyIGhldCBhbm5vdGF0aWVwcm9jZXMuIEVyIHdvcmRlbiBoaWVyIDUwIHRocmVhZHMgZ2VicnVpa3QgZGl0IG9tIGRlIHN0cmVzcyB2YW4gaGV0IHByb2NlcyB0ZSB2ZXJkZWxlbi4NCg0KIyMgUmVzdWx0YXRlbiAvIFZpc3VhbGlzYXRpZSBsb2dib2VrIHRlYW1nZW5vdGVuDQoNCiFbRmlndXVyIDE0OiBSZXN1bGF0ZW4gU25wRWZmXShpbWFnZXMvY2xpcGJvYXJkLTE1NDk2Mjc2NTcucG5nKQ0KDQpEaXQgemlqbiBkZSByZXN1bHRhdGVuIHVpdCBoZXQgbG9nYm9layB2YW4gRmxvcmlzLiBVaXQgZGV6ZSB0YWJlbGxlbiBpcyB0ZSBoYWxlbiBkYXQgaGV0IGdyb290c3RlIGRlZWwgdmFuIGRlIHZhcmlhbnRlbiBpbiBzYW1wbGUgU1JSMjY5ODA1NDkgemlqbiBpbnNlcnRpZXMgb2YgZWVuIHNucCAoU2luZ2xlLU51Y2xlb3RpZGUgUG9seW1vcnBoaXNtKS4gRGV6ZSB2YXJpYW50ZW4gemlqbiBncm90ZW5kZWVsIG1pc3NlbnNlIG9mIHNpbGVudC4gRGl0IGJldGVrZW50IGRhdCB3YW5uZWVyIGRlemUgbXV0YXRpZXMgb3AgZWVuIGV4b24geml0dGVuIGhldCBwcm9ibGVtZW4ga2FuIGdldmVuIGluIGRlIGV4cHJlc3NpZSB2YW4gaGV0IGdlbi4NCg0KVm9vciB2ZXJkZXJlIGFuYWx5c2Uga2lqayBuYWFyIGhldCBsb2dib2VrIHZhbiBmbG9yaXMuDQoNCiMjIFJlbGZlY3RpZSAtIGRpc2N1c3NpZSByZXN1bHRhdGVuDQoNCklrIGhlYiBiZXZvbmRlbiBkYXQgZXIgbmlldCB2cm9lZyBnZW5vZWcgaXMgYmVnb25uZW4gbWV0IGRlIGFuYWx5c2UgdmFuIGRlIHZpc3VhbGlzYXRpZSwgZGl0IGlzIG9tZGF0IGlrIG5vZyBuaWV0IGRlIHBvc2l0aWUgaGViIGt1bm5lbiB2aW5kZW4gdmFuIGRlIHNwaWtlcyB1aXQgZGUgZ3JhZmlla2VuIGluIGZpZ3V1ciA2LiBEYWFybmFhc3Qgdm9vciBkZSBvbmRlcnpvZWtzIHZyYWFnIGVyIHppam4gd2VsIHZhcmlhbnRlbiBhYW53ZXppZyBtYWFyIGlrIGhlYiBuaWV0IGt1bm5lbiBhY2h0ZXJoYWxlbiBvZiBkZXplIG5vdSBnb2VkIG9mIHNsZWNodGUgdmFyaWFudGVuIHppam4uIER1cyBpayBkZW5rIGRhdCBoZXQgYmVsYW5ncmlqayBpcyBvbSBzbmVsbGVyIGJlemlnIHRlIGdhYW4gbWV0IGRlIHZpc3VhbGlzYXRpZSBlbiBkZSB2aXN1YWxpc2F0aWUgdGUgYW5hbHlzZXJlbiBlbiBkYWFybWVlIHdlZXIgZWVuIG5pZXV3ZSB2aXN1YWxpc2F0aWUgZG9lbiB2b29yIGRlIGludGVyZXNhbnRlIGRpbmdlbiBkaWUgZGFhciB1aXRrb21lbi4NCg0KIyMgUmVmZXJlbnRpZXMNCg==